Странное добавление пространства имен при импорте библиотеки типов - PullRequest
0 голосов
/ 12 ноября 2009

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

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() в другом проекте, C ++ говорит, что не может преобразовать IStream* в MyLibrary::IStream*. В то же время он не жалуется на IUnknown.

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

1 Ответ

0 голосов
/ 13 ноября 2009

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

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

...