Migration du code C++ de la directive #import à TLIBIMP.EXE

De RAD Studio
Aller à : navigation, rechercher

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;
 }

Voir aussi