次の 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'
さて、問題は、タイプライブラリ内で発生および定義されたimportlib
ディレクティブへのものが原因であるためです-MSDNはそれを説明し、使用または使用する必要があると言います.IStream
ISequentialStream
include
no_auto_exclude
#import
どちらno_auto_exclude
かを使用するか、include( "IStream", "ISequentialStream" )
現在2つのIStream
定義があります.1つはグローバル名前空間にあり、もう1つは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
実際に正しいソリューションを使用していますか?