2010-08-02 42 views
2

我一直有被稱爲COM互操作的野獸延長遇到一個.TLB ...問題使用MIDL來創建的.idl「期待型規格」

目前我正在試圖生成一個.TLB從OLE/COM對象查看器生成的.idl文件。然而,當試圖運行MIDL.EXE編譯它,我得到一個錯誤:

.\Sim.API.IDL(236) : error MIDL2025 : syntax error : expecting a type s 
pecification near "ImportFileStatus" 

我.idl文件更是1000線長,所以我並不特別想然而它張貼在這裏,我相信部分令人感興趣的是:

typedef [uuid(980B172E-19C1-389A-BB74-29A54737C5B4), version(1.0) , 
    custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "Sim.API.ImportFileResult")  
] 
struct tagImportFileResult { 

    ImportFileStatus _status; 

    LPSTR _message; 
} ImportFileResult; 

那麼幾行後...

typedef [uuid(A4B9A0FF-A2D4-3EC5-AB7E-69311B9122C8), version(1.0) , 
    custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "Sim.API.ImportFileStatus")  
] 
enum { 
    ImportFileStatus_Success = 0, 
    ImportFileStatus_VersionMismatch = 1, 
    ImportFileStatus_Failure = 2 
} ImportFileStatus; 

我有一種感覺,這些都應該以固定的型號規格誤差被大家敬仰。但是,如果我這樣做,我會遇到一個新問題。

midl\oleaut32.dll : warning MIDL2368 : error generating type library, ignored : 
Could not set UUID : tagImportFileResult (0x800288C6) 

我對IDL格式,並配合使用MIDL.EXE的相當陌生,或許有一些公然錯了我在做什麼?

一如往常的任何幫助,將不勝感激:)

回答

5

你是正確的,交換的聲明必須保持MIDL高興。 OleView.exe確實不會以原始順序生成聲明。我認爲它按照類型lib的組織方式將它們分組。

您收到的信息只是一個警告,而不是錯誤。它是由具有不同結構名稱的別名引起的。您可以放心地忽略它,因爲代碼不會使用「tagImportFileResult」標識符。但是你可以通過標籤名一樣的typedef名稱擺脫它:

typedef [..] 
    struct ImportFileResult { 
    //... 
} ImportFileResult; 

下面是關於這個問題的KB article

+0

感謝漢斯,我永遠不會注意到第二個錯誤只是一個警告:P。順便提一下,是否有更好的方法來生成不會改變順序的IDL?你是否還知道COM Interop的其他有用資源?再次感謝! – Jambobond 2010-08-02 13:28:21

+2

當然,只要問原始作者他的.idl文件。你會得到兩個可能的答案中的一個:「沒問題!」或者「你在開玩笑,這是受版權保護的軟件,你的許可明文禁止你這樣做!」。或者你永遠不會聽到任何回聲,不可能因爲它的可能年齡。 – 2010-08-02 13:45:46

+1

其實我是原作者^^或者至少我的公司是,長的故事,但這基本上是爲了避免使用對象屬性時的'propput'而不是'propputref'問題。所以我必須使用Regasm生成並註冊原始.dll,然後編輯.IDL以將propputref替換爲propput,最後使用Midl重新生成tlb。 FUN !!!! :P – Jambobond 2010-08-02 14:14:48