Migration du code C++ de la directive #import à TLIBIMP.EXE
Remonter à TLIBIMP.EXE
Cette rubrique décrit les problèmes à résoudre quand vous passez de l'utilisation de la directive #import
à celle de TLIBIMP.EXE afin d'importer correctement une bibliothèque de types. Si vous essayez d'utiliser #import
, le compilateur C++ émet l'avertissement W8137 : Directive #import obsolète rencontrée. Veuillez utiliser à la place l'utilitaire TLIBIMP. (C++).
TLIBIMP.EXE et la directive #import
génèrent différents GUIDs pour une coclasse donnée :
- Avec #import :
__uuidof(CoClass)
renvoie le GUID de la CoClasse. - Avec TLIBIMP :
__uuidof(CoClass)
renvoie le GUID de l'interface par défaut de la CoClasse.
Par exemple, voici le code généré par #import
pour la bibliothèque de types représentée par l'extrait .ridl suivant :
[
uuid(ECD2547D-5BC5-49C6-A7D1-9D55C0A9F0DF),
version(1.0)
]
library Project14
{
importlib("stdole2.tlb");
coclass CoClass1;
interface Interface1;
[
uuid(AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA),
dual,
oleautomation
]
interface Interface1: IDispatch
{
};
[
uuid(cccccccc-cccc-cccc-cccc-cccccccccccc)
]
coclass CoClass1
{
[default] interface Interface1;
};
};
Pour CoClass1 de la bibliothèque de types ci-dessus, #import
génère la déclaration suivante (dans les coulisses) :
struct __declspec(uuid("cccccccc-cccc-cccc-cccc-cccccccccccc"))
CoClass1;
En d'autres termes, lors de l'utilisation de la directive #import
, le GUID associé au type CoClass1 est effectivement le GUID de la CoClasse.
Toutefois, TLIBIMP génère la déclaration suivante pour CoClass1 :
interface DECLSPEC_UUID("{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}") Interface1;
typedef Interface1 CoClass1;
Ainsi, le code qui utilise __uuidof(CoClass1)
avec #import
ne fonctionne pas lors de l'utilisation de la liaison générée par TLIBIMP.
Par exemple, le code suivant ne fonctionne pas :
#include <stdio.h>
#import "test.tlb"
using namespace TestLibrary;
int main()
{
GUID g = __uuidof(CoClass1);
printf("GUID of CoClass1"
" = {%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\n",
g.Data1, g.Data2, g.Data3,
g.Data4[0], g.Data4[1],
g.Data4[2], g.Data4[3],
g.Data4[4], g.Data4[5],
g.Data4[6], g.Data4[7]);
return 0;
}
Ainsi, lors du basculement de la directive #import
à une unité générée par TLIBIMP, vous devez faire attention au code qui dépend de __uuidof(CoClassName)
afin de renvoyer le GUID de la CoClasse. A la place, le code doit utiliser les GUIDs CLSID_xxxx générés par TLIBIMP pour les CoClasses.
C'est-à-dire que vous devez réécrire le code ci-dessus comme suit :
#include <stdio.h>
//#import "test.tlb"
#include "TestLibrary_TLB.h"
//using namespace TestLibrary;
int main()
{
// GUID g = __uuidof(CoClass1);
GUID g = CLSID_CoClass1;
printf("GUID of CoClass1"
" = {%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\n",
g.Data1, g.Data2, g.Data3,
g.Data4[0], g.Data4[1],
g.Data4[2], g.Data4[3],
g.Data4[4], g.Data4[5],
g.Data4[6], g.Data4[7]);
return 0;
}