Migrieren von C++-Code von #import nach TLIBIMP.EXE
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;
}