免註冊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之後有需要在研究了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章