Je donne les résultats suivants IDL:Puis-je utiliser "exclude" avec la directive # import lorsque je rencontre l'avertissement C4192?
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);
};
}
qui est compilé dans un fichier .tlb et importé d'un autre projet:
#import "PathToTypeLib.tlb" raw_interfaces_only
et quand cela est compilé Visual Studio émet la sortie suivante:
warning C4192: automatically excluding 'IStream'
while importing type library 'PathToTypeLib.tlb'
warning C4192: automatically excluding 'ISequentialStream'
while importing type library 'PathToTypeLib.tlb'
D'accord, le problème est que ceux à importlib
directives ont causé IStream
et ISequentialStream
défini à l'intérieur de la typelib - MSDN explains it et dit que je dois soit utiliser include
ou no_auto_exclude
avec #import
.
Si j'utiliser soit no_auto_exclude
ou include("IStream", "ISequentialStream")
j'ai maintenant deux IStream
définitions - un dans l'espace global et un autre dans l'espace de noms typelib et mon code qui essaie d'appeler MyMethod
ne compile pas - le compilateur dit
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
donc il semble que je devrais plutôt utiliser exclude("IStream", "ISequentialStream")
- de cette façon, il compile bien et semble fonctionner.
L'utilisation de exclude
utilise-t-elle réellement la bonne solution?
Soit l'utilisation exclut ou no_namespace. Favor exclure. –