2011-08-08 25 views
3

爲什麼我無法在idl文件中定義接口,然後讓CoClass在同一個文件的庫塊中派生它,當我從接口派生所述接口時我已經在另一個Proxy Server項目中定義了?從同一個文件中定義的接口派生的MIDL CoClass

[ 
object, 
uuid(00000000-0000-0000-0000-000000000000), 
pointer_default(unique) 
] interface IMyInterfaceB: IMyInterfaceA 
{ 
    [id(1), helpstring("")] 
    HRESULT NewMethod(); 
} 

[ 
uuid(10000000-0000-0000-0000-000000000000), 
helpstring("Type Library 1.00"), 
version(1.00) 
] 
library MyLibrary 
{ 
    importlib("stdole32.tlb"); 
    importlib("stdole2.tlb"); 

    [ 
     uuid(20000000-0000-0000-0000-000000000001), 
     helpstring("My Class") 
    ] 
    coclass CMyClass 
    { 
     interface IMyInterfaceA; 
     //interface IMyInterfaceB; /* error when I remove rem */ 
    }; 

} 

1> MIDL \的oleaut32.dll:錯誤MIDL2020:錯誤生成類型庫:佈局失敗:IMyInterfaceB(0x800288C6

+0

沒有repro。 IMyInterfaceA聲明丟失,因此難以重新創建錯誤。 [source]屬性幾乎肯定是錯誤的,只能將它用於生成事件的調度接口。如果有意的話,你需要聲明其中的一個[默認]。不要選擇你自己的guid,使用guidgen.exe –

+0

@Hans Passant上面的代碼是通用垃圾。 。 。我不選擇GUID。 。 。 。我將刪除[源代碼]並意識到[源代碼,默認]。 ..我分開代理和對象,我發現我仍然得到錯誤,當我提到從庫中的IUnknown以外的其他接口:/ –

+0

實際上重現問題的郵政編碼。 –

回答

1

作爲漢斯帕桑特指出我不應該選擇GUID的,發生器應使用雖然這不是問題,但它本質上是相似的,我在定義接口時沒有遵循正確的ID模式,直到現在它並不重要。 COM編程中的適當部分(帶有Microsoft .NET)當我嘗試第一個錯誤查找工具時發現原因時間,通過打開Visual Studios高級模式功能暴露了它的存在。

經驗教訓:/

BekaD:

1

您需要在基礎和繼承接口使用的id屬性不同的值。

0

用戶「vpp」與這一個是正確的。當我試圖讓一個新的接口繼承另一個接口時,我只是經歷了這個錯誤,所以我可能會重載其中一個方法。我複製並粘貼了原始界面的全部內容,但沒有將「id(1)」部分更改爲新的唯一編號,因此我還收到「錯誤MIDL2020:錯誤生成類型庫:LayOut失敗」

相關問題