代码之家  ›  专栏  ›  技术社区  ›  Jambobond

使用MIDL从.idl创建.tlb时出现问题“需要类型规范”

  •  2
  • Jambobond  · 技术社区  · 15 年前

    我一直在与被称为com interop的野兽进行长时间的接触…

    我目前正在尝试从由OLE/COM对象查看器生成的.idl文件生成.tlb。但是,当尝试运行mil.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格式和mil.exe的使用非常不熟悉,也许我所做的工作有明显的错误?

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

    1 回复  |  直到 11 年前
        1
  •  5
  •   Hans Passant    15 年前

    您是正确的,交换声明是保持MIDL快乐所必需的。oleview.exe确实不会按原始顺序生成声明。我认为它按类型对它们进行分组,就像类型lib的组织方式一样。

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

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

    这里有一个 KB article 关于这个问题。