MIDL: правильный синтаксис для вывода пространств имен для пользовательских типов / перечислений? - PullRequest
0 голосов
/ 01 мая 2018

Я взял свою сборку .NET, использовал OleView для генерации файла IDL, теперь использую

midl /header MyAssembly.h MyAssembly.tlb

для создания заголовочного файла для использования в действительно старом COM-проекте.

Теперь MyAssembly.dll ссылается на MyAssembly.Core.dll - поэтому я создал файл IDL для MyAssembly.Core.dll, а также mscorlib.dll и успешно сгенерировал мои файлы .i_c и .h из midl для всех трех .

Проблема в том, что файлы .h не содержат пространства имен! Я получаю вывод, как это:

virtual /* [id] */ HRESULT STDMETHODCALLTYPE DoThing( 
        /* [in] */ MyEnums MyEnum) = 0;

когда я ожидаю увидеть:

virtual /* [id] */ HRESULT STDMETHODCALLTYPE DoThing( 
        /* [in] */ MyAssembly_Core::MyEnums MyEnum) = 0;

MyAssembly.idl:

import "MyAssembly.Core.idl";
[
    uuid(1ED54182-DF43-4FF4-9887-1C105E50427D),
    version(1.0),
    custom(90883F05-3D28-11D2-8F17-00A0C9A6186D, "MyAssembly, Version=1.0.0.0, 
    Culture=neutral, PublicKeyToken=null")
]
library MyAssembly
{
    // TLib :     // TLib :  : {515919C5-1821-44B6-8B7A-C42045E2483A}
    importlib("MyAssembly.Core.tlb");
    // TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}
    importlib("mscorlib.tlb");
    // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");
(the rest of the idl)

И MyAssembly.Core.dll:

import "mscorlib.idl";
[
    uuid(515919C5-1821-44B6-8B7A-C42045E2483A),
    version(1.0),
    custom(90883F05-3D28-11D2-8F17-00A0C9A6186D, "MyAssembly.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
]
library MyAssembly_Core
{
    // TLib :     // TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}
    importlib("mscorlib.tlb");
    // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");

    typedef [uuid(E01EAD76-4F8F-4B76-AF58-FCC03609EB61), version(1.0),
    custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "MyAssembly.Core.MyEnums")
    ]
        enum {
        MyEnum_UNKNOWN = 0xffffffff,
        MyEnum_One = 1,
        MyEnum_Two = 2
    } MyEnums;
(the rest of the idl)

Наконец, mscorlib.idl:

#if (__midl >= 800)
    midl_pragma warning(disable: 2362)
#endif 

[
    uuid(BED7F4EA-1A96-11D2-8F08-00A0C9A6186D),
    version(2.4),
    helpstring("mscorlib.dll"),
    custom(90883F05-3D28-11D2-8F17-00A0C9A6186D, "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
]
library mscorlib
{
    // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");
(the rest of the idl)

Я что-то здесь упускаю, я просто не знаю, что.

Так как же IDL генерирует правильные пространства имен для выходных заголовочных файлов?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...