Ao escrever componentes COM+ no Delphi5, o ObjectContext nem sempre pode ser obtido
Ou seja, chamar GetObjectContext retorna nulo. Isso impede que o processamento da transação seja correto.
Pronto. Alguém me disse na Internet para adicionar uma linha antes do componente COM+ para carregar mtxex.dll.
declaração. Ele resolve esse problema, mas parece estar instável.
Procedimento TgEntityObj.Initialize;
começar
herdado;
LoadLibrary('mtxex.dll');
fim;
Mas posso obter o ObjectContext no Delphi6 sem adicionar esta instrução.
Vi que a unidade MTX do D6 é realmente diferente do D5, não posso culpar a Borland por isso.
Quando o D5 foi lançado, o WIN2000 (COM+) ainda não havia sido lançado, então a unidade MTX no D5 ainda estava carregada.
Como escrever MTS.
Linha 253 na unidade D5 MTX.
implementação
usaComObj;
tipo
TGetObjectContextProc = função(var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = função (const rid: TGUID; Desconhecido: IUnknown): Ponteiro;
var
GetObjectContextProc: TGetObjectContextProc = nil;
SafeRefProc: TSafeRefProc = nulo;
MtsProcsLoaded: Booleano = Falso;
procedimento LoadMtsProcs;
var
Mtxdll: HModule;
começar
se MtsProcsLoaded então Sair;
MtsProcsLoaded := Verdadeiro;
Mtxdll := GetModuleHandle('mtxex.dll');
se mtxdll <> 0 então
começar
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
fim;
fim;
função GetObjectContext: IObjectContext;
começar
CarregarMtsProcs;
se atribuído (GetObjectContextProc) então
OleCheck(GetObjectContextProc(Resultado))
outro
Resultado := nil; //Retorna nulo ao executar etapa única.
fim;
Observe que a unidade MTX em D6 é diferente.
implementação
usaComObj;
tipo
TGetObjectContextProc = função(var ObjectContext: IObjectContext): HRESULT;
///
TCoGetObjectContextProc = função(const riid: TGUID; var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = função (const rid: TGUID; Desconhecido: IUnknown): Ponteiro;
var
GetObjectContextProc: TGetObjectContextProc = nil;
CoGetObjectContextProc: TCoGetObjectContextProc = nil;
SafeRefProc: TSafeRefProc = nulo;
MtsProcsLoaded: Booleano = Falso;
function IsComPlusPlatform: boolean; ////// Se é COM+
var
Ver: TOsVersionInfo;////
começar
Ver.dwOSVersionInfoSize := sizeof(Ver);////
GetVersionEx(Ver);
if (Ver.dwPlatformID = VER_PLATFORM_WIN32_NT) e ///
(Ver.dwMajorVersion >= 5) então ////
Resultado := verdadeiro //
senão Resultado: = falso;
fim; //////
procedimento LoadMtsProcs;
var
Mtxdll: HModule;
começar
se MtsProcsLoaded então Sair;
MtsProcsLoaded := Verdadeiro;
se IsComPlusPlatform então ////
começar
Mtxdll := GetModuleHandle('ole32.dll');
se mtxdll <> 0 então ///
@CoGetObjectContextProc := GetProcAddress(Mtxdll, 'CoGetObjectContext');
fim ///
outro
começar
Mtxdll := GetModuleHandle('mtxex.dll');
se mtxdll <> 0 então
começar
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
fim;
fim;
fim;
função GetObjectContext: IObjectContext;
const
IID_IObjectContext: TGUID = '{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}';
começar
CarregarMtsProcs;
se atribuído(CoGetObjectContextProc) então ///
CoGetObjectContextProc(IID_IObjectContext, Resultado) ///
senão se atribuído (GetObjectContextProc) então
OleCheck(GetObjectContextProc(Resultado))
outro
Resultado := nulo;
fim;
As partes afinadas diagonalmente são as mais numerosas. Você só precisa adicionar D5 MTX a essas partes e salvá-las no diretório atual do seu programa.
Compile o programa para obter o ObjectContext.