1. 程式人生 > >免註冊COM使用參考

免註冊COM使用參考

免註冊COM在使用時要使用檔案清單(manifest檔案),檔案清單在使用時可分為兩種:

1.程式清單:

指明程式包含哪些依賴元件。

C\C++的程式清單資訊可在專案屬性中編輯,用於自動生成。

C#的程式清單暫時沒找到自動生成的辦法,使用VS本身提供的清單生成工具生成的清單無法正確使用。因此只能手動編寫。

2.元件清單:

指明元件(DLL)的COM相關資訊,GUID等資訊,基本和註冊在登錄檔中的資訊一致。

元件清單可用VS工具mt.exe來生成,具體參看MSDN。

用mt.exe時有時會需要用到tlb檔案,如果是C#的COM的話,則可以用Tlbexp.exe(型別庫匯出程式)從DLL生成TLB檔案,一般不會這樣用,C#的話一般就是直接指明為託管程式集,直接從DLL元件清單。C++的COM的話,可以用從DLL嵌入的資源中獲取。

使用檔案清單可以通過以下幾種方式:

1.嵌入,這個需要在工程屬性中設定。

2.使用對應命名的清單檔案。例如:

程式清單:

         檔案:1.exe

         清單:1.exe.manifest

元件清單:

         檔案:1.dll

         清單:1.manifest

紅字部分要一致。並且請將對應的檔案和清單放置在一起。

3.使用Activation Context API載入指定清單。(這個還未有研究)

使用前兩種方法時,要求被呼叫的dll與呼叫者在同一目錄下。也有說是在呼叫者的子目錄下也可以。

例項程式碼可以在下面下載:

http://download.csdn.net/detail/u011623102/8060055

####################################################################################################

2014-12-11 更新

之前寫的Com免註冊方法,Dll檔案必須在執行的應用程式同目錄或子目錄下,在實際使用中有太大的侷限性。

其實在C#中要是能夠知道所要掉的Com的位置,其實是可以用tlbimp.exe工具將Com元件轉換成一個託管DLL。在引用此DLL就可以了。

C++呼叫C#的COM元件,最好的方法還是去使用Activation Context API載入指定清單。

使用的一個例項是在標頭檔案中

#import “Dll或TLB"

看文件好像應該是還要加一個巨集,我自己用的時候是建立的使用MFC的控制檯程式,所以直接引用就可以用。

關鍵的結構是ACTCTX

ACTCTX actCtx;
    memset((void*)&actCtx, 0, sizeof(ACTCTX));
    actCtx.cbSize = sizeof(ACTCTX);
    actCtx.lpSource = _T("指定路徑的manifest檔案"); //直接使用manifest檔案時只設置這個就可以了
 HANDLE hCtx = ::CreateActCtx(&actCtx);
    if (hCtx == INVALID_HANDLE_VALUE)
    {
        cout << "CreateActCtx returned: INVALID_HANDLE_VALUE"
        << endl;
    }
    else
    {
        ULONG_PTR cookie;
        if (::ActivateActCtx(hCtx, &cookie))
        {
            // previous compound statement goes here...
            //像註冊了COM一樣呼叫就好
            ::DeactivateActCtx(0, cookie);
        }
    }

好像ACTCTX中的lpSource欄位還可以指定為DLL或是EXE

這樣使用時需要用lpResourceName欄位來指定嵌入的哪一個資源是清單資源

自此暫時夠用了,ACTCTX指定DLL之後有需要在研究了