Beim Schreiben von COM+-Komponenten in Delphi5 kann der ObjectContext nicht immer abgerufen werden
Das heißt, der Aufruf von GetObjectContext gibt Null zurück. Dies verhindert, dass die Transaktionsverarbeitung korrekt ist.
Fertig. Jemand hat mir im Internet gesagt, ich solle vor der COM+-Komponente eine Zeile hinzufügen, um mtxex.dll zu laden
Anweisung Es löst dieses Problem, aber es scheint instabil zu laufen.
PROcedure TgEntityObj.Initialize;
beginnen
geerbt;
LoadLibrary('mtxex.dll');
Ende;
Aber ich kann den ObjectContext in Delphi6 abrufen, ohne diese Anweisung hinzuzufügen.
Ich habe gesehen, dass sich die MTX-Einheit im D6 tatsächlich vom D5 unterscheidet. Das kann ich Borland nicht vorwerfen.
Als D5 herauskam, war WIN2000 (COM+) noch nicht herausgekommen, sodass die MTX-Einheit in D5 noch geladen war.
Wie schreibt man MTS?
Linie 253 im D5 MTX-Gerät.
Durchführung
nutztComObj;
Typ
TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = function(const rid: TGUID; Unk: IUnknown): Pointer;
var
GetObjectContextProc: TGetObjectContextProc = nil;
SafeRefProc: TSafeRefProc = nil;
MtsProcsLoaded: Boolean = False;
Prozedur LoadMtsProcs;
var
Mtxdll: HModule;
beginnen
if MtsProcsLoaded then Exit;
MtsProcsLoaded := True;
Mtxdll := GetModuleHandle('mtxex.dll');
wenn mtxdll <> 0 dann
beginnen
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
Ende;
Ende;
Funktion GetObjectContext: IObjectContext;
beginnen
LoadMtsProcs;
if Assigned(GetObjectContextProc) then
OleCheck(GetObjectContextProc(Result))
anders
Ergebnis := nil; //Gibt null zurück, wenn ein einzelner Schritt ausgeführt wird.
Ende;
Beachten Sie, dass die MTX-Einheit in D6 anders ist.
Durchführung
nutztComObj;
Typ
TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT;
///
TCoGetObjectContextProc = function(const riid: TGUID; var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = function(const rid: TGUID; Unk: IUnknown): Pointer;
var
GetObjectContextProc: TGetObjectContextProc = nil;
CoGetObjectContextProc: TCoGetObjectContextProc = nil; ///
SafeRefProc: TSafeRefProc = nil;
MtsProcsLoaded: Boolean = False;
function IsComPlusPlatform: boolean; ////// Ob es COM+ ist
var
Ver: TOsVersionInfo;////
beginnen
Ver.dwOSVersionInfoSize := sizeof(Ver);////
GetVersionEx(Ver);
if (Ver.dwPlatformID = VER_PLATFORM_WIN32_NT) und///
(Ver.dwMajorVersion >= 5) then////
Ergebnis := wahr //
sonst Ergebnis := false;
Ende; //////
Prozedur LoadMtsProcs;
var
Mtxdll: HModule;
beginnen
if MtsProcsLoaded then Exit;
MtsProcsLoaded := True;
wenn IsComPlusPlatform dann ////
beginnen
Mtxdll := GetModuleHandle('ole32.dll');
wenn mtxdll <> 0 dann ///
@CoGetObjectContextProc := GetProcAddress(Mtxdll, 'CoGetObjectContext');
Ende ///
anders
beginnen
Mtxdll := GetModuleHandle('mtxex.dll');
wenn mtxdll <> 0 dann
beginnen
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
Ende;
Ende;
Ende;
Funktion GetObjectContext: IObjectContext;
const
IID_IObjectContext: TGUID = '{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}';
beginnen
LoadMtsProcs;
if Assigned(CoGetObjectContextProc) then ///
CoGetObjectContextProc(IID_IObjectContext, Ergebnis) ///
sonst wenn Assigned(GetObjectContextProc) dann
OleCheck(GetObjectContextProc(Result))
anders
Ergebnis := Null;
Ende;
Die diagonal ausgedünnten Teile sind die vielen Teile. Sie müssen nur D5 MTX zu diesen Teilen hinzufügen und es dann im aktuellen Verzeichnis Ihres Programms speichern.
Kompilieren Sie das Programm, um den ObjectContext zu erhalten.