Lors de l'écriture de composants COM+ dans Delphi5, l'ObjectContext ne peut pas toujours être obtenu
Autrement dit, l'appel de GetObjectContext renvoie zéro. Cela empêche le traitement des transactions d'être correct.
Terminé. Quelqu'un m'a dit sur Internet d'ajouter une ligne avant le composant COM+ pour charger mtxex.dll.
déclaration. Cela résout ce problème, mais il semble fonctionner instable.
PROcédure TgEntityObj.Initialize ;
commencer
hérité;
LoadLibrary('mtxex.dll');
fin;
Mais je peux obtenir l'ObjectContext dans Delphi6 sans ajouter cette instruction.
J'ai vu que l'unité MTX du D6 est effectivement différente du D5, je ne peux pas en vouloir à Borland.
Lorsque le D5 est sorti, WIN2000 (COM+) n'était pas encore sorti, donc l'unité MTX du D5 était toujours chargée.
Comment écrire MTS.
Ligne 253 dans l'unité D5 MTX.
mise en œuvre
utiliseComObj ;
taper
TGetObjectContextProc = function(var ObjectContext : IObjectContext) : HRESULT ;
TSafeRefProc = function(const rid : TGUID ; Unk : IUnknown) : Pointeur ;
var
GetObjectContextProc : TGetObjectContextProc = nul ;
SafeRefProc : TSafeRefProc = nul ;
MtsProcsLoaded : Booléen = Faux ;
procédure LoadMtsProcs ;
var
Mtxdll : Module ;
commencer
si MtsProcsLoaded alors Quittez ;
MtsProcsLoaded := Vrai ;
Mtxdll := GetModuleHandle('mtxex.dll');
si mtxdll <> 0 alors
commencer
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
fin;
fin;
fonction GetObjectContext : IObjectContext ;
commencer
LoadMtsProcs ;
si assigné (GetObjectContextProc) alors
OleCheck (GetObjectContextProc (Résultat))
autre
Résultat := nil; //Renvoie null lors de l'exécution d'une seule étape.
fin;
Notez que l'unité MTX du D6 est différente.
mise en œuvre
utiliseComObj ;
taper
TGetObjectContextProc = function(var ObjectContext : IObjectContext) : HRESULT ;
///
TCoGetObjectContextProc = function(const riid : TGUID ; var ObjectContext : IObjectContext) : HRESULT ;
TSafeRefProc = function(const rid : TGUID ; Unk : IUnknown) : Pointeur ;
var
GetObjectContextProc : TGetObjectContextProc = nul ;
CoGetObjectContextProc : TCoGetObjectContextProc = nul ;
SafeRefProc : TSafeRefProc = nul ;
MtsProcsLoaded : Booléen = Faux ;
function IsComPlusPlatform: boolean; ////// S'il s'agit de COM+
var
Version : TOsVersionInfo ;////
commencer
Ver.dwOSVersionInfoSize := sizeof(Ver);////
GetVersionEx(Ver);
si (Ver.dwPlatformID = VER_PLATFORM_WIN32_NT) et///
(Ver.dwMajorVersion >= 5) alors////
Résultat := vrai //
sinon Résultat := false;
fin; //////
procédure LoadMtsProcs ;
var
Mtxdll : HModule ;
commencer
si MtsProcsLoaded alors Quittez ;
MtsProcsLoaded := Vrai ;
si IsComPlusPlatform alors ////
commencer
Mtxdll := GetModuleHandle('ole32.dll'); ///
si mtxdll <> 0 alors ///
@CoGetObjectContextProc := GetProcAddress(Mtxdll, 'CoGetObjectContext');
fin ///
autre
commencer
Mtxdll := GetModuleHandle('mtxex.dll');
si mtxdll <> 0 alors
commencer
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
fin;
fin;
fin;
fonction GetObjectContext : IObjectContext ;
const
IID_IObjectContext : TGUID = '{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}' ; ///
commencer
LoadMtsProcs ;
si assigné (CoGetObjectContextProc) alors ///
CoGetObjectContextProc(IID_IObjectContext, Résultat) ///
sinon si assigné (GetObjectContextProc) alors
OleCheck (GetObjectContextProc (Résultat))
autre
Résultat := nul;
fin;
Les pièces amincies en diagonale sont les plus nombreuses. Il vous suffit d'ajouter du D5 MTX à ces pièces. Ensuite, enregistrez-les dans le répertoire courant de votre programme.
Compilez le programme pour obtenir l'ObjectContext.