我有一個.dll包含一些directshow過濾器(COM)與特定/自定義接口進行查詢。如果沒有提供IDL(用於TLB)從一個COM + DLL當它不提供
大多數第三方directshow組件都包含可用於交叉環境通信(C#typelib導入)的嵌入式.tlb文件。
我不願意嘗試手動創建c#所需的接口,因爲沒有提供idl/tlb文件。
是否有可能從COM .dll生成一個tlb(或至少,我可以MIDL編譯的idl)?
我有一個.dll包含一些directshow過濾器(COM)與特定/自定義接口進行查詢。如果沒有提供IDL(用於TLB)從一個COM + DLL當它不提供
大多數第三方directshow組件都包含可用於交叉環境通信(C#typelib導入)的嵌入式.tlb文件。
我不願意嘗試手動創建c#所需的接口,因爲沒有提供idl/tlb文件。
是否有可能從COM .dll生成一個tlb(或至少,我可以MIDL編譯的idl)?
是的,可以對IDL進行反向工程/反彙編(或者非常接近它的東西)。你需要做的是給自己一個新的C++控制檯項目賦予的
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
默認代碼,然後您將#include語句下面的#import語句。所以我一直在使用標記爲COM Interop DLL的C#程序集,並將其稱爲ComExample2,它與我添加的C++控制檯項目處於相同的解決方案,這意味着我可以使用一個很好的相對路徑名。所以我的#import語句看起來像
#import "..\ComExample2\bin\Debug\ComExample2.tlb" no_namespace named_guids
然後你建立你的控制檯應用程序。如果您深入瞭解構建期間生成的文件,您會發現以.TLH結尾的文件,該文件代表類型庫標頭。所以我的路徑是
..\ComExample2\ConsoleApplication1\Debug\comexample2.tlh
在我的文件裏面看起來非常像idl。下面是經編輯的片段,給你一個味道....
struct __declspec(uuid("515b1b18-1602-4d42-b743-f1b3c458a0d0"))
/* LIBID */ __ComExample2;
struct /* coclass */ ComExampleClass2;
//
// Type library items
//
struct __declspec(uuid("713007fe-e74c-4fec-b91a-5ef8df279929"))
IFoo : IDispatch
{
//
// Wrapper methods for error-handling
//
_bstr_t Greeting ();
long Sim (
long a,
long b);
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall raw_Greeting (
/*[out,retval]*/ BSTR * pRetVal) = 0;
virtual HRESULT __stdcall raw_Sim (
/*[in]*/ long a,
/*[in]*/ long b,
/*[out,retval]*/ long * pRetVal) = 0;
};
struct __declspec(uuid("efe233b5-8ab3-4414-855e-1f027e0a72d5"))
ComExampleClass2;
// interface _Object
// [ default ] interface IFoo
所有這一切都生成的代碼,這樣就可以對一個COM庫容易腳本的C++代碼。你必須挑選你需要的東西,但希望這應該足夠。
親切的問候,
主巴滕伯格
看看[tlbexp.exe(http://msdn.microsoft.com/en-us/library/hfzzah2c.aspx) – paulsm4
是不是隻適用於.NET程序集? [ComVisible] –
不,你在擁擠的足球場裏大聲呼救。有一個程序員可以爲你提供你所需要的東西。你會在這裏找到他的機率是zilch。拿起電話,給他打電話。如果他不想幫忙,那麼這就是結束的地方。 –