使用Midl从.idl创建.tlb“期望类型规范”的问题

时间:2010-08-02 12:03:41

标签: com com-interop idl midl typelib

我和被称为COM Interop的野兽长期相遇......

我目前正在尝试从OLE / COM对象查看器生成的.idl文件生成.tlb。但是,当尝试运行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,也许我正在做的事情有些明显错误?

一如既往,我们将非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:5)

你是对的,交换声明是为了让MIDL满意。 OleView.exe确实不会按原始顺序生成声明。我认为它按类型分组,类型lib的组织方式。

您收到的消息只是一个警告,而不是错误。它是由结构名称的别名不同引起的。您可以放心地忽略它,因为代码不会使用“tagImportFileResult”标识符。但是你可以通过使标签名称与typedef名称相同来消除它:

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

这是关于这个主题的KB article