Проблемы с использованием Midl для создания .tlb из .idl, ожидая спецификации типа

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

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

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


person Jambobond    schedule 02.08.2010    source источник


Ответы (1)


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

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

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

Вот статья базы знаний по этой теме.

person Hans Passant    schedule 02.08.2010
comment
Спасибо, Ганс, я бы никогда не заметил, что вторая ошибка была просто предупреждением: P. Кстати, есть ли лучший способ сгенерировать IDL, который не меняет порядок? Также знаете ли вы какие-либо другие полезные ресурсы по COM-взаимодействию? Еще раз спасибо! - person Jambobond; 02.08.2010
comment
Конечно, просто спросите у первоначального автора его .idl-файл. Вы получите один из двух возможных ответов: без проблем! или вы шутите, это программное обеспечение, защищенное авторским правом, ваша лицензия прямо запрещает вам это делать !. Или вы никогда ничего не услышите в ответ, что весьма вероятно, учитывая его вероятный возраст. - person Hans Passant; 02.08.2010
comment
На самом деле я оригинальный автор ^^ или, по крайней мере, моя компания, Длинная история, но это в основном для того, чтобы обойти проблему «propput», а не «propputref» при использовании свойств объекта. Поэтому мне нужно сгенерировать и зарегистрировать исходный .dll с помощью Regasm, а затем отредактировать .IDL, чтобы заменить propputref на propput и, наконец, перестроить TLB с помощью Midl. ВЕСЕЛЬЕ!!!! :П - person Jambobond; 02.08.2010