Проблемы Использование Midl для создания .tlb из .idl «ожидая спецификации типа» - PullRequest
2 голосов
/ 02 августа 2010

У меня была длительная встреча со зверем, известным как COM Interop ...

В настоящее время я пытаюсь сгенерировать .tlb из файла .idl, созданного OLE / COM Object Viewer. Однако при попытке запустить 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, возможно, что-то явно неправильно с тем, что я делаю?

Как всегда, любая помощь будет принята с благодарностью:)

1 Ответ

5 голосов
/ 02 августа 2010

Вы правы, обмен мнениями необходим, чтобы MIDL был доволен. OleView.exe действительно не будет генерировать объявления в исходном порядке. Я думаю, что он группирует их по типу, так как организован тип lib.

Сообщение, которое вы получаете, является просто предупреждением, а не ошибкой. Это вызвано наличием псевдонима для имени структуры, которое отличается. Вы можете спокойно проигнорировать это, потому что код не будет использовать идентификатор «tagImportFileResult». Но вы можете избавиться от него, сделав имя тега таким же, как имя typedef:

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

Вот статья КБ на эту тему.

...