เมื่อเขียนส่วนประกอบ COM+ ใน Delphi5 จะไม่สามารถรับ ObjectContext ได้เสมอไป
นั่นคือ การเรียก GetObjectContext จะคืนค่าศูนย์ ซึ่งจะช่วยป้องกันไม่ให้การประมวลผลธุรกรรมถูกต้อง
เสร็จสิ้น มีคนบอกฉันบนอินเทอร์เน็ตให้เพิ่มบรรทัดก่อนคอมโพเนนต์ COM+ เพื่อโหลด mtxex.dll
คำสั่งนี้ช่วยแก้ปัญหานี้ได้ แต่ดูเหมือนว่าจะทำงานไม่เสถียร
กระบวนการ TgEntityObj.Initialize;
เริ่ม
สืบทอด;
LoadLibrary('mtxex.dll');
จบ;
แต่ฉันสามารถรับ ObjectContext ใน Delphi6 ได้โดยไม่ต้องเพิ่มคำสั่งนี้
ฉันเห็นว่าหน่วย MTX ใน D6 นั้นแตกต่างจาก D5 จริงๆ ฉันไม่สามารถตำหนิ Borland สำหรับเรื่องนี้
เมื่อ D5 ออกมา WIN2000 (COM+) ยังไม่ออกมา ดังนั้น MTX unit ใน D5 ก็ยังโหลดอยู่
วิธีเขียนเอ็มทีเอ
สาย 253 ในหน่วย D5 MTX
การดำเนินการ
ใช้ComObj;
พิมพ์
TGetObjectContextProc = ฟังก์ชั่น (var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = ฟังก์ชั่น (กำจัด: TGUID; Unk: IUnknown): ตัวชี้;
var
GetObjectContextProc: TGetObjectContextProc = ไม่มี;
SafeRefProc: TSafeRefProc = ไม่มี;
MtsProcsLoaded: บูลีน = เท็จ;
ขั้นตอน LoadMtsProcs;
var
Mtxdll: HModule;
เริ่ม
ถ้า MtsProcsLoaded แล้วออก;
MtsProcsLoaded := จริง;
Mtxdll := GetModuleHandle('mtxex.dll');
ถ้า mtxdll <> 0 แล้ว
เริ่ม
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
จบ;
จบ;
ฟังก์ชัน GetObjectContext: IObjectContext;
เริ่ม
LoadMtsProcs;
ถ้าได้รับมอบหมาย (GetObjectContextProc) แล้ว
OleCheck (GetObjectContextProc (ผลลัพธ์))
อื่น
ผลลัพธ์ := nil; // ส่งคืน null เมื่อดำเนินการขั้นตอนเดียว
จบ;
โปรดทราบว่าหน่วย MTX ใน D6 นั้นแตกต่างออกไป
การดำเนินการ
ใช้ComObj;
พิมพ์
TGetObjectContextProc = ฟังก์ชั่น (var ObjectContext: IObjectContext): HRESULT;
-
TCoGetObjectContextProc = ฟังก์ชั่น (const riid: TGUID; var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = ฟังก์ชั่น (กำจัด: TGUID; Unk: IUnknown): ตัวชี้;
var
GetObjectContextProc: TGetObjectContextProc = ไม่มี;
CoGetObjectContextProc: TCoGetObjectContextProc = ไม่มี;
SafeRefProc: TSafeRefProc = ไม่มี;
MtsProcsLoaded: บูลีน = เท็จ;
ฟังก์ชั่น IsComPlusPlatform: boolean; ////// ไม่ว่าจะเป็น COM+
var
เวอร์ชัน: TOsVersionInfo;////
เริ่ม
Ver.dwOSVersionInfoSize := sizeof(Ver);////
GetVersionEx(เวอร์ชั่น);
ถ้า (Ver.dwPlatformID = VER_PLATFORM_WIN32_NT) และ///
(Ver.dwMajorVersion >= 5) จากนั้น////
ผลลัพธ์ := จริง //
ผลลัพธ์อื่น := false;
จบ; //////
ขั้นตอน LoadMtsProcs;
var
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}';
เริ่ม
LoadMtsProcs;
ถ้าได้รับมอบหมาย (CoGetObjectContextProc) แล้ว ///
CoGetObjectContextProc (IID_IObjectContext ผลลัพธ์) ///
อย่างอื่นถ้า Assigned(GetObjectContextProc) แล้ว
OleCheck (GetObjectContextProc (ผลลัพธ์))
อื่น
ผลลัพธ์ := ไม่มี;
จบ;
ส่วนที่บางในแนวทแยงคือหลายส่วน คุณจะต้องเพิ่ม D5 MTX ลงในส่วนเหล่านี้ จากนั้นบันทึกลงในไดเร็กทอรีปัจจุบันของโปรแกรมของคุณ
คอมไพล์โปรแกรมเพื่อรับ ObjectContext