2

我一直在与被称为 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 的使用非常不熟悉,也许我正在做的事情有什么明显的错误?

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

4

1 回答 1

5

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

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

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

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

于 2010-08-02T12:50:48.543 回答