Migrieren von C++-Code von #import nach TLIBIMP.EXE

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu TLIBIMP.EXE


Dieses Thema befasst sich mit Importproblemen bei Typbibliotheken, die beim Wechseln von #import zu TLIBIMP.EXE auftreten. Bei Verwendung von #import gibt der C++-Compiler die Warnung W8137 Veraltete Direktive #import gefunden. Bitte verwenden Sie stattdessen das Hilfsprogramm TLIBIMP. (C++) aus.

TLIBIMP.EXE und die Direktive #import erzeugen unterschiedliche GUIDs für eine gegebene CoClass:

  • Bei #import: gibt __uuidof(CoClass) die GUID der CoClass zurück.
  • Bei TLIBIMP: gibt __uuidof(CoClass) die GUID des Standard-Interface der CoClass zurück.


Hier ist beispielsweise der Code, der von #import für die durch das folgende .ridl-Fragment dargestellte Typbibliothek erzeugt wird:

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

Für CoClass1 aus der obigen Typbibliothek erzeugt #import die folgende Deklaration (im Hintergrund):

 struct __declspec(uuid("cccccccc-cccc-cccc-cccc-cccccccccccc"))
 CoClass1;

Mit anderen Worten, wenn Sie #import verwenden, ist die dem Typ CoClass1 zugeordnete GUID tatsächlich die GUID der CoClass.

TLIBIMP erzeugt dagegen für CoClass1 die folgende Deklaration:

 interface DECLSPEC_UUID("{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}") Interface1;
  
 typedef Interface1 CoClass1;

Mit der von TLIBIMP erzeugten Bindung funktioniert Code daher nicht, der __uuidof(CoClass1) mit #import enthält.

Beispielsweise funktioniert der folgende Code nicht:

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

Beim Wechseln von #import zu einer von TLIBIMP erzeugten Unit müssen Sie also auf Code achten, der für die Rückgabe der GUID der CoClass von __uuidof(CoClassName) abhängt. Der Code sollte stattdessen die von TLIBIMP für CoClasses erzeugten CLSID_xxxx GUIDs enthalten.

Der obige Code müsste also folgendermaßen umgeschrieben werden:


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

Siehe auch