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-подобную коррекцию случая.

Другие вопросы по тегам