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