Странное добавление пространства имен при импорте библиотеки типов

Я хочу добавить метод, принимающий IStream* в свой COM-интерфейс. Вот выдержка из холостого хода:

import "oaidl.idl";
import "ocidl.idl";
import "objidl.idl";//IStream is declared in this .idl file
[
    uuid(uuidhere),
    version(1.0)
]
library MyLibrary
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");
    [
     object,
     uuid("interfaceid"),
     dual,
     nonextensible,
     oleautomation,
    hidden
    ]
    interface IMyInterface : IUnknown {
        HRESULT LoadStream( [in] IStream* stream );
        HRESULT LoadUnknown( [in] IUnknown* unkn );
    };
}

Я компилирую файл .idl и импортирую библиотеку типов в другой проект.

Когда я просматриваю .tlb в файле OLEView, я вижу, что IStream объявлен внутри моей библиотеки типов, а IUnknown — нет. Это вызывает проблемы - когда я пытаюсь вызвать IMyInterface::LoadStream() в другом проекте, С++ говорит, что не может преобразовать IStream* в MyLibrary::IStream*. В то же время он не жалуется на IUnknown.

Почему MIDL помещает определение IStream внутрь библиотеки типов, а не рассматривает его как глобальное определение?


person Community    schedule 12.11.2009    source источник
comment
К вашему сведению, ocidl.idl импортирует oaidl.idl, oaidl.dil импортирует objidl.idl, а objidl.idl импортирует unknwn.idl. Так что вам просто нужно импортировать ocidl.idl.   -  person    schedule 07.02.2015


Ответы (1)


У вас есть два потока IStream, один глобальный (объявленный в objidl.idl), другой в пространстве имен MyLibrary (объявленный в вашем idl). Удалите тот, который находится в пространстве имен MyLibrary.

Если вы планируете поддерживать клиенты сценариев, я предлагаю вам также предоставить интерфейс IDispatch, поскольку IStream не поддерживается языками сценариев.

person Sheng Jiang 蒋晟    schedule 12.11.2009
comment
Вот чего я не понимаю. Что именно мне сделать, чтобы удалить объявление in-typelib? - person sharptooth; 13.11.2009
comment
удалить объявление IStream из idl. - person Sheng Jiang 蒋晟; 13.11.2009
comment
Если я удалю import objidl.idl, поведение останется прежним. Что еще я могу сделать? - person sharptooth; 16.11.2009
comment
удалить интерфейс объявления IStream IMyInterface : IUnknown { HRESULT LoadStream([in] IStream* stream ); HRESULT LoadUnknown([in] IUnknown* unkn); }; - person Sheng Jiang 蒋晟; 16.11.2009
comment
Я не объявляю IStream, я использую его только для указания параметра метода. - person sharptooth; 18.11.2009