Al escribir componentes COM+ en Delphi5, no siempre se puede obtener el ObjectContext
Es decir, llamar a GetObjectContext devuelve cero. Esto impide que el procesamiento de transacciones sea correcto.
Listo. Alguien me dijo en Internet que agregara una línea antes del componente COM+ para cargar mtxex.dll.
declaración Resuelve este problema, pero parece funcionar de manera inestable.
Procedimiento TgEntityObj.Initialize;
comenzar
heredado;
LoadLibrary('mtxex.dll');
fin;
Pero puedo obtener el ObjectContext en Delphi6 sin agregar esta declaración.
Vi que la unidad MTX del D6 es realmente diferente de la D5. No puedo culpar a Borland por esto.
Cuando salió D5, WIN2000 (COM+) aún no había salido, por lo que la unidad MTX en D5 todavía estaba cargada.
Cómo escribir MTS.
Línea 253 en unidad D5 MTX.
implementación
utilizaComObj;
tipo
TGetObjectContextProc = función (var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = función (const rid: TGUID; Desconocido: IUnknown): Puntero;
var
GetObjectContextProc: TGetObjectContextProc = nulo;
SafeRefProc: TSafeRefProc = nulo;
MtsProcsLoaded: Booleano = Falso;
procedimiento LoadMtsProcs;
var
Mtxdll: HModule;
comenzar
si MtsProcsLoaded entonces Salir;
MtsProcsLoaded:= Verdadero;
Mtxdll := GetModuleHandle('mtxex.dll');
si mtxdll <> 0 entonces
comenzar
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
fin;
fin;
función GetObjectContext: IObjectContext;
comenzar
cargarMtsProcs;
si está asignado (GetObjectContextProc) entonces
OleCheck(GetObjectContextProc(Resultado))
demás
Resultado := nil; //Devuelve nulo al ejecutar un solo paso.
fin;
Tenga en cuenta que la unidad MTX en D6 es diferente.
implementación
utilizaComObj;
tipo
TGetObjectContextProc = función (var ObjectContext: IObjectContext): HRESULT;
///
TCoGetObjectContextProc = función (const riid: TGUID; var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = función (const rid: TGUID; Desconocido: IUnknown): Puntero;
var
GetObjectContextProc: TGetObjectContextProc = nulo;
CoGetObjectContextProc: TCoGetObjectContextProc = nulo ///
SafeRefProc: TSafeRefProc = nulo;
MtsProcsLoaded: Booleano = Falso;
función IsComPlusPlatform: boolean; ////// Si es COM+
var
Ver: TOsVersionInfo;////
comenzar
Ver.dwOSVersionInfoSize: = tamaño de (Ver);////
GetVersionEx(Ver);
si (Ver.dwPlatformID = VER_PLATFORM_WIN32_NT) y///
(Ver.dwMajorVersion >= 5) entonces////
Resultado := verdadero //
de lo contrario Resultado: = falso;
fin; //////
procedimiento LoadMtsProcs;
var
Mtxdll: HModule;
comenzar
si MtsProcsLoaded entonces Salir;
MtsProcsLoaded:= Verdadero;
si IsComPlusPlatform entonces ////
comenzar
Mtxdll := GetModuleHandle('ole32.dll'); ///
si mtxdll <> 0 entonces ///
@CoGetObjectContextProc := GetProcAddress(Mtxdll, 'CoGetObjectContext');
fin ///
demás
comenzar
Mtxdll := GetModuleHandle('mtxex.dll');
si mtxdll <> 0 entonces
comenzar
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
fin;
fin;
fin;
función GetObjectContext: IObjectContext;
constante
IID_IObjectContext: TGUID = '{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}';
comenzar
cargarMtsProcs;
si está asignado (CoGetObjectContextProc) entonces ///
CoGetObjectContextProc(IID_IObjectContext, Resultado) ///
de lo contrario, si está asignado (GetObjectContextProc), entonces
OleCheck(GetObjectContextProc(Resultado))
demás
Resultado := nulo;
fin;
Las partes adelgazadas en diagonal son las más numerosas. Sólo necesita agregar D5 MTX a estas partes y luego guardarlas en el directorio actual de su programa.
Compile el programa para obtener el ObjectContext.