Проблемы Использование Midl для создания.tlb из.idl "ожидая спецификации типа"
У меня была длительная встреча со зверем, известным как 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 ответ
Вы правы, замена объявлений необходима, чтобы MIDL был доволен. OleView.exe действительно не будет генерировать объявления в исходном порядке. Я думаю, что он группирует их по типу, так как организован тип lib.
Сообщение, которое вы получаете, является просто предупреждением, а не ошибкой. Это вызвано наличием псевдонима для имени структуры, которое отличается. Вы можете спокойно проигнорировать это, потому что код не будет использовать идентификатор "tagImportFileResult". Но вы можете избавиться от него, сделав имя тега таким же, как имя typedef:
typedef [..]
struct ImportFileResult {
//...
} ImportFileResult;
Вот статья КБ на эту тему.