При написании компонентов COM+ в Delphi5 не всегда можно получить ObjectContext.
То есть вызов GetObjectContext возвращает ноль. Это препятствует корректной обработке транзакции.
Готово. Кто-то посоветовал мне в Интернете добавить строку перед компонентом COM+ для загрузки mtxex.dll.
Это решение решает эту проблему, но, похоже, работает нестабильно.
ПРОЦЕДУРА TgEntityObj.Initialize;
начинать
унаследованный;
LoadLibrary('mtxex.dll');
конец;
Но я могу получить ObjectContext в Delphi6, не добавляя этот оператор.
Я увидел, что блок MTX в D6 действительно отличается от D5, и я не могу винить в этом Borland.
Когда вышел D5, WIN2000 (COM+) еще не вышел, поэтому блок MTX в D5 все еще был загружен.
Как написать МТС.
Линия 253 в блоке D5 MTX.
выполнение
используетComObj;
тип
TGetObjectContextProc = функция (вар ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = функция (constrid: TGUID; Unk: IUnknown): Указатель; cdecl;
вар
GetObjectContextProc: TGetObjectContextProc = ноль;
SafeRefProc: TSafeRefProc = ноль;
MtsProcsLoaded: Boolean = False;
процедура LoadMtsProcs;
вар
Mtxdll: HModule;
начинать
если MtsProcsLoaded, то выйти;
MtsProcsLoaded := Истина;
Mtxdll := GetModuleHandle('mtxex.dll');
если mtxdll <> 0, то
начинать
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
конец;
конец;
функция GetObjectContext: IObjectContext;
начинать
ЛоадМтсПрокс;
если Назначено(GetObjectContextProc), то
OleCheck(GetObjectContextProc(Результат))
еще
Результат := nil; // Возвращает ноль при выполнении одного шага.
конец;
Обратите внимание, что блок MTX в D6 другой.
выполнение
используетComObj;
тип
TGetObjectContextProc = функция (вар ObjectContext: IObjectContext): HRESULT;
///
TCoGetObjectContextProc = функция (const riid: TGUID; вар ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = функция (constrid: TGUID; Unk: IUnknown): Указатель; cdecl;
вар
GetObjectContextProc: TGetObjectContextProc = ноль;
CoGetObjectContextProc: TCoGetObjectContextProc = ноль ///
SafeRefProc: TSafeRefProc = ноль;
MtsProcsLoaded: Boolean = False;
функция IsComPlusPlatform: boolean ////// Является ли это COM+;
вар
Версия: TOsVersionInfo;////
начинать
Ver.dwOSVersionInfoSize := sizeof(Ver);////
GetVersionEx(Вер);
if (Ver.dwPlatformID = VER_PLATFORM_WIN32_NT) и///
(Ver.dwMajorVersion >= 5), тогда////
Результат := верно //
иначе Результат: = ложь;
конец; //////
процедура LoadMtsProcs;
вар
Mtxdll: HModule;
начинать
если MtsProcsLoaded, то выйти;
MtsProcsLoaded := Истина;
если IsComPlusPlatform, то ////
начинать
Mtxdll := GetModuleHandle('ole32.dll'); ///
если mtxdll <> 0, то ///
@CoGetObjectContextProc := GetProcAddress(Mtxdll, 'CoGetObjectContext');
конец ///
еще
начинать
Mtxdll := GetModuleHandle('mtxex.dll');
если mtxdll <> 0, то
начинать
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
конец;
конец;
конец;
функция GetObjectContext: IObjectContext;
константа
IID_IObjectContext: TGUID = '{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}'; ///
начинать
ЛоадМтсПрокс;
если Назначено(CoGetObjectContextProc), то ///
CoGetObjectContextProc(IID_IObjectContext, Результат) ///
иначе, если назначено (GetObjectContextProc), то
OleCheck(GetObjectContextProc(Результат))
еще
Результат:= ноль;
конец;
Диагонально утонченные части — это множество частей. Вам нужно только добавить к этим частям D5 MTX. Затем сохраните его в текущем каталоге вашей программы.
Скомпилируйте программу, чтобы получить ObjectContext.