2013-08-22 56 views
4

我有一個.dll包含一些directshow過濾器(COM)與特定/自定義接口進行查詢。如果沒有提供IDL(用於TLB)從一個COM + DLL當它不提供

大多數第三方directshow組件都包含可用於交叉環境通信(C#typelib導入)的嵌入式.tlb文件。

我不願意嘗試手動創建c#所需的接口,因爲沒有提供idl/tlb文件。

是否有可能從COM .dll生成一個tlb(或至少,我可以MIDL編譯的idl)?

+0

看看[tlbexp.exe(http://msdn.microsoft.com/en-us/library/hfzzah2c.aspx) – paulsm4

+0

是不是隻適用於.NET程序集? [ComVisible] –

+0

不,你在擁擠的足球場裏大聲呼救。有一個程序員可以爲你提供你所需要的東西。你會在這裏找到他的機率是zilch。拿起電話,給他打電話。如果他不想幫忙,那麼這就是結束的地方。 –

回答

3

是的,可以對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++代碼。你必須挑選你需要的東西,但希望這應該足夠。

親切的問候,

主巴滕伯格