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;

これは、この件に関するKB 記事です。

于 2010-08-02T12:50:48.543 に答える