天天看點

C#寫ActiveX控件總結

1.問題的提出。

   我們公司的系統一開始是用VC6.0開發的,現在的程式是用C#2.0 vs2005開發的,兩個程式之間要進行互相調用。

為了好寫命名VC6的com叫 mark.ocx C#的ActiveX叫npr.dll

mark.ocx 要調npr.dll來得到一個檔案,當檔案打開的時候,檔案菜單上就會出現mark.ocx,像批注一樣的功能,

批注完成以後,npr.dll要把mark.ocx産生的批注資訊放到DataBase裡面,就是這樣一個調用過程。

2.下面是代碼片段

//接口

 [Guid("BC5969B4-518A-4590-B332-94BAAAF1C24A")]

    public interface IProofRead

    ...{

        PDF接口屬性#region PDF接口屬性

        /**//// <summary>

        /// 目前正在校對的報紙

        /// </summary>

        string PaperCode ...{get;set;}

      /**//// <summary>

        ///  擷取sequence的校次的pdf路徑。

        /// </summary>

        /// <param name="sequence">目前校次</param>

        /// <param name="path">路徑</param>

        /// <returns>得到路徑是否成功</returns>

        bool GetPdfPath(int sequence, out string path); 

        #endregion

    }

 //接口實作

[Guid("EB4CF432-0286-4ec1-9889-8BF3BDCB0882")]

    public class ProofRead : IProofRead, IObjectSafety

    ...{

       /**//// <summary>

        /// 目前正在校對的報紙

        /// </summary>

        public string PaperCode 

        ...{

            get ...{ return _papercode; }

            set ...{ _papercode = value; }

        }

 /**//// <summary>

        ///  擷取sequence的校次的pdf路徑。

        /// </summary>

        /// <param name="sequence">校次</param>

        /// <param name="path">路徑</param>

        /// <returns>得到路徑是否成功</returns>

        public bool GetPdfPath(int sequence, out string path)

        ...{

          //some to do

         }

}

下面是VC6調用的代碼:

#if 0

#include <iostream.h>

#import "..ProofPdfCom/ProofPdfCom.tlb"  no_namespace

#pragma comment(lib, "comsupp.lib")

#include "comutil.h"

void main(void)

{

    // 聲明HRESULT和Simple_ATL接口指針

    HRESULT hr;

    IProofPdfProxy *IFirstATL = NULL;

    // 初始化COM

    hr = CoInitialize(0);

    // 使用SUCCEEDED 宏并檢查我們是否能得到一個接口指針 

    if(SUCCEEDED(hr))

    {

        hr = CoCreateInstance( CLSID_ProofPdfProxy, NULL, CLSCTX_INPROC_SERVER,

            IID_IProofPdfProxy, (void**) &IFirstATL);

        // 如果成功,則調用AddNumbers方法,否則顯示相應的出錯資訊

        if(SUCCEEDED(hr))

        {

                                                               string b;

            IFirstATL->Getpdf(1,&b);

            IFirstATL->Release(); 

        }

        else

        {

            cout << "CoCreateInstance Failed." << endl;

        }

    //    cin.get();

    }

    // 釋放COM

    CoUninitialize();

}

#endif

3.關于調試

用C#寫的com由于與系統不是同一直程序,沒法調試,現在給大家介紹一個好用的調試資訊工具;

Dbgview.exe

用法:

[DllImport("KERNEL32.DLL", CharSet = CharSet.Auto, SetLastError = true)]

        private static extern void OutputDebugString(char[] lpText);

        public static void SpellerViewLog(string errorPlace)

        {

            #if DEBUG

            errorPlace = "調試資訊:" + errorPlace;

                        OutputDebugString(errorPlace.ToCharArray());

            #endif

        }

        public void load()

        {

             SpellerViewLog("xxx");

       }

在運作程式的時候,就打開Dbgview.exe,就可以看到:調試資訊:xxx了。

哈哈,就寫到這裡了,關于源碼,我會放到一個專業的控件開發論壇:

小強控件開發論壇。歡迎大家成為一員,為控件開發排疑解惑。

源代碼下載下傳