Com 使用Midl从.idl创建.tlb的问题;需要一个类型规范“;

Com 使用Midl从.idl创建.tlb的问题;需要一个类型规范“;,com,com-interop,idl,midl,typelib,Com,Com Interop,Idl,Midl,Typelib,我一直在与被称为COM互操作的野兽进行长时间的接触 我当前正在尝试从OLE/COM对象查看器生成的.idl文件生成.tlb。但是,当尝试运行Midl.exe对其进行编译时,我遇到一个错误: .\Sim.API.IDL(236) : error MIDL2025 : syntax error : expecting a type s pecification near "ImportFileStatus" 我的.idl文件长度超过1000行,因此我不特别想在这里发布它,但是,我相信我感兴趣的部分

我一直在与被称为COM互操作的野兽进行长时间的接触

我当前正在尝试从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的使用非常不熟悉,也许我所做的有什么明显的错误


如往常一样,任何帮助都将不胜感激:)

您是正确的,交换声明是保持MIDL满意所必需的。OleView.exe确实不会按原始顺序生成声明。我认为它是按照类型库的组织方式对它们进行分类的

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

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

这是一个关于这个主题的问题。

谢谢Hans,我永远不会注意到第二个错误只是一个警告:p。顺便问一下,有没有更好的方法来生成不会改变顺序的IDL?您还知道COM互操作的其他有用资源吗?再次感谢!当然,只要向原始作者索要他的.idl文件即可。你会得到两个可能的回答中的一个:“没问题!”或者“你在开玩笑,这是受版权保护的软件,你的许可证明确禁止你这样做!”。或者你永远不会听到任何回音,考虑到它可能的年龄,这是不可能的。实际上我是原始作者^^^^或者至少我的公司是,说来话长,但这基本上是为了在使用对象属性时绕过“propput”而不是“propputref”问题。因此,我必须生成原始的.dll并用Regasm注册,然后编辑.IDL以用propput替换propputref,最后用Midl重建tlb。有趣!!!!:P