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