Есть ли способ заставить midl генерировать каждый интерфейс в отдельном .h?

У меня есть набор объектов, которые наследуют интерфейсы абстракций, созданные из файла idl. Каждый объект, использующий эти интерфейсы, включает один и тот же файл interfaces.h, который содержит все сгенерированные c ++ абстрактные классы, которые сопоставляются с интерфейсом idl.

Каждый раз, когда я что-то меняю в interfaces.idl, все классы, зависящие от этого, должны быть перестроены после изменения interfaces.h. Есть ли флаг или что-то, что бы сказать midl о создании каждого абстрактного класса в его собственном .h?


person Emmanuel Caradec    schedule 17.07.2009    source источник


Ответы (2)


Единственный способ, который я могу придумать, - это поместить каждый интерфейс в свой собственный файл IDL или разделить их на несколько IDL в соответствии со скоростью изменения.

Затем включите (или это #import - я забыл) эти IDL интерфейса в IDL основной библиотеки, который создаст библиотеку типов, если вам это нужно.

person Kim Gräsman    schedule 17.07.2009
comment
Это возможно, но не очень просто, потому что я интегрирую typelib внутри приложения. Добавление отдельной библиотеки для каждого из них было бы болезненным. В Midl есть все необходимое для разделения .h, я ожидал, что кто-то даст мне волшебный флаг волшебного инструмента, чтобы это сделать. - person Emmanuel Caradec; 20.07.2009
comment
По-прежнему должна быть только одна библиотека типов - иметь один главный IDL, который включает каждый интерфейс IDL и содержит блок библиотеки. У вас это не работает? - person Kim Gräsman; 20.07.2009
comment
Надо было читать внимательнее, это именно то, что мне нужно. Спасибо. - person Emmanuel Caradec; 17.08.2009

Вот пример того, как организовать idl для создания отдельных файлов .h и единой библиотеки типов. Правильная директива - import.

main.idl

import "oaidl.idl";
import "ocidl.idl";

import "frag1.idl";
import "frag2.idl";

[
    uuid(1BECE2AF-2792-49b9-B133-BBC89C850D6F),
    version(1.0),
    helpstring("Bibliothèque de types")
]
library Library
{
    importlib("stdole2.tlb");

    interface IFrag1;
    interface IFrag2;
}

frag1.idl

import "oaidl.idl";
import "ocidl.idl";

[
    object,
    uuid(9AEB517B-48B9-4628-8DD3-4A0BA8D39BEF),
    dual,
    nonextensible,
    helpstring("Interface IFrag1"),
    pointer_default(unique)
]
interface IFrag1 : IDispatch {
    HRESULT frag1();
};

frag2.idl

import "oaidl.idl";
import "ocidl.idl";

[
    object,
    uuid(D60835D4-E1B1-40fb-B583-A75373EF15BE),
    dual,
    nonextensible,
    helpstring("Interface IFrag2"),
    pointer_default(unique)
]
interface IFrag2 : IDispatch {
    HRESULT frag2();
};
person Emmanuel Caradec    schedule 17.08.2009