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

Jam*_*ond 2 com idl com-interop typelib midl

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

我目前正在尝试从OLE/COM对象查看器生成的.idl文件生成.tlb.但是,当尝试运行Midl.exe来编译它时,我收到一个错误:

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

我的.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;
Run Code Online (Sandbox Code Playgroud)

然后几行......

 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;
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,应该尊重这些以修复类型规范错误.但是,如果我这样做,我会遇到一个新问题.

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

我对idl格式非常不熟悉,并且使用midl.exe,也许我正在做的事情有些明显错误?

一如既往的任何帮助将不胜感激:)

Han*_*ant 5

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

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

typedef [..] 
   struct ImportFileResult {
   //...
} ImportFileResult;
Run Code Online (Sandbox Code Playgroud)

这是关于这个主题的知识库文章.

  • 当然,只要问原作者他的.idl文件.你会得到两个可能的回答中的一个:"没问题!" 或者"你在开玩笑,这是受版权保护的软件,你的许可明确禁止你这样做!".或者你永远不会听到任何回报,鉴于其可能的年龄,并非不可能. (2认同)