MIDL изменяет регистр идентификатора при компиляции файла IDL
У меня есть фрагмент IDL, который выглядит следующим образом:
[ object, uuid(...), pointer_default(unique) ]
interface IVirtualMachine { /* ... */ }
[ object, uuid(...), pointer_default(unique) ]
interface IVirtualServer : IUnknown
{
HRESULT FindVirtualMachine(
[in] BSTR configurationName,
[out,retval] IVirtualMachine **virtualMachine);
};
[ uuid(...), version(1.0) ]
library VirtualServerLib
{
[ uuid(...) ]
coclass VirtualServer
{
[default] interface IVirtualServer;
};
[ uuid(...) ]
coclass VirtualMachine
{
[default] interface IVirtualMachine;
};
};
... когда я компилирую его с помощью MIDL, а затем смотрю в сгенерированную библиотеку типов, VirtualMachine
(верхний регистр V) был превращен в virtualMachine
(строчная буква V).
Если я назову мой Coclass XirtualMachine
Например, все хорошо.
Что за черт?
2 ответа
Решение
Это ужасная ошибка / особенность MIDL. Он не позволяет одному и тому же идентификатору появляться с другим регистром, поэтому он заменяет все последующие вхождения слова на регистр с первого раза, когда его видели.
Смотрите KB220137
ХОРОШО. Сработало. Именно эта строка здесь:
[out,retval] IVirtualMachine **virtualMachine);
Если я изменю это на:
[out,retval] IVirtualMachine **ppVirtualMachine);
... тогда это работает нормально. Наверное, что-то не так в MIDL. Может быть, он пытается сделать VB-подобную коррекцию случая.