Delphi5에서 COM+ 구성 요소를 작성할 때 ObjectContext를 항상 얻을 수는 없습니다.
즉, GetObjectContext를 호출하면 nil이 반환되므로 트랜잭션 처리가 올바르게 수행되지 않습니다.
완료되었습니다. 누군가 인터넷에서 mtxex.dll을 로드하려면 COM+ 구성 요소 앞에 줄을 추가하라고 말했습니다.
이 문제는 해결되었으나 불안정하게 실행되는 것 같습니다.
PROcedure TgEntityObj.Initialize;
시작하다
상속됨;
LoadLibrary('mtxex.dll');
끝;
하지만 이 문을 추가하지 않고도 Delphi6에서 ObjectContext를 얻을 수 있습니다.
나는 D6의 MTX 장치가 실제로 D5와 다르다는 것을 보았으며 이에 대해 Borland를 비난할 수는 없습니다.
D5가 나왔을 당시에는 WIN2000(COM+)이 아직 나오지 않았기 때문에 D5에는 MTX 유닛이 그대로 탑재되어 있었습니다.
MTS 작성 방법.
D5 MTX 장치의 라인 253.
구현
용도ComObj;
유형
TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = function(constrid: TGUID; Unk: IUnknown): 포인터;
var
GetObjectContextProc: TGetObjectContextProc = nil;
SafeRefProc: TSafeRefProc = nil;
MtsProcsLoaded: 부울 = False;
절차 LoadMtsProcs;
var
Mtxdll: HModule;
시작하다
MtsProcsLoaded이면 종료합니다.
MtsProcsLoaded := True;
Mtxdll := GetModuleHandle('mtxex.dll');
mtxdll <> 0이면
시작하다
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
끝;
끝;
함수 GetObjectContext: IObjectContext;
시작하다
LoadMtsProcs;
할당된 경우(GetObjectContextProc) 다음
OleCheck(GetObjectContextProc(결과))
또 다른
Result := nil; //단일 단계 실행 시 null을 반환합니다.
끝;
D6의 MTX 장치는 다릅니다.
구현
용도ComObj;
유형
TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT;
///
TCoGetObjectContextProc = function(const riid: TGUID; var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = function(constrid: TGUID; Unk: IUnknown): 포인터;
var
GetObjectContextProc: TGetObjectContextProc = nil;
CoGetObjectContextProc: TCoGetObjectContextProc = nil;
SafeRefProc: TSafeRefProc = nil;
MtsProcsLoaded: 부울 = False;
function IsComPlusPlatform: boolean ////// COM+인지 여부
var
버전: TOsVersionInfo;////
시작하다
Ver.dwOSVersionInfoSize := sizeof(Ver);////
GetVersionEx(버전);
if (Ver.dwPlatformID = VER_PLATFORM_WIN32_NT) 및///
(Ver.dwMajorVersion >= 5) 그러면////
결과 := 참 //
else 결과 := false;
끝; //////
절차 LoadMtsProcs;
var
Mtxdll: HModule;
시작하다
MtsProcsLoaded이면 종료합니다.
MtsProcsLoaded := True;
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;
const
IID_IObjectContext: TGUID = '{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}' ///
시작하다
LoadMtsProcs;
if Assigned(CoGetObjectContextProc) 그러면 ///
CoGetObjectContextProc(IID_IObjectContext, 결과) ///
그렇지 않은 경우 할당(GetObjectContextProc)이면
OleCheck(GetObjectContextProc(결과))
또 다른
결과 := 없음;
끝;
대각선으로 가늘어진 부분은 이 부분에 D5 MTX를 추가하기만 하면 됩니다. 그런 다음 프로그램의 현재 디렉토리에 저장하세요.
프로그램을 컴파일하여 ObjectContext를 얻습니다.