我有以下 IDL:
import "oaidl.idl";
import "ocidl.idl";
[uuid(MyLibUuid), version(1.0)]
library MyLibrary
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[object, uuid("MyInterfaceUuid"), nonextensible]
interface IMyInterface : IUnknown {
HRESULT MyMethod( [in] IStream* stream );
};
}
它被编译成一个 .tlb 文件并从另一个项目中导入:
#import "PathToTypeLib.tlb" raw_interfaces_only
当它被编译时,Visual Studio 会发出以下输出:
warning C4192: automatically excluding 'IStream'
while importing type library 'PathToTypeLib.tlb'
warning C4192: automatically excluding 'ISequentialStream'
while importing type library 'PathToTypeLib.tlb'
好的,问题是因为那些在 typelib中importlib
引起IStream
和定义的指令 - MSDN 解释它并说我必须使用或使用.ISequentialStream
include
no_auto_exclude
#import
如果我使用其中一个,no_auto_exclude
或者include( "IStream", "ISequentialStream" )
我现在有两个IStream
定义——一个在全局命名空间中,另一个在 typelib 命名空间中,所以我试图调用的代码MyMethod
无法编译——编译器说
error C2664: 'MyLibrary::MyInterface::MyMethod' :
cannot convert parameter 1 from 'IStream *' to 'MyLibrary::IStream *'
Types pointed to are unrelated; conversion requires reinterpret_cast,
C-style cast or function-style cast
所以看起来我不得不使用exclude( "IStream", "ISequentialStream" )
- 这样它编译得很好并且看起来工作。
是否使用exclude
了正确的解决方案?