Saat menulis komponen COM+ di Delphi5, ObjectContext tidak selalu bisa diperoleh
Yaitu, memanggil GetObjectContext menghasilkan nihil. Hal ini mencegah pemrosesan transaksi menjadi benar.
Selesai. Seseorang mengatakan kepada saya di Internet untuk menambahkan baris sebelum komponen COM+ untuk memuat mtxex.dll
pernyataan. Itu memang menyelesaikan masalah ini, tetapi tampaknya berjalan tidak stabil.
Prosedur TgEntityObj.Inisialisasi;
mulai
diwariskan;
LoadLibrary('mtxex.dll');
akhir;
Tapi saya bisa mendapatkan ObjectContext di Delphi6 tanpa menambahkan pernyataan ini.
Saya melihat unit MTX di D6 memang berbeda dengan D5. Saya tidak bisa menyalahkan Borland dalam hal ini.
Saat D5 keluar, WIN2000 (COM+) belum keluar, sehingga unit MTX di D5 masih dimuat.
Cara menulis MTS.
Jalur 253 di unit D5 MTX.
pelaksanaan
menggunakanComObj;
jenis
TGetObjectContextProc = fungsi(var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = fungsi(const rid: TGUID; Unk: IUnknown): Pointer;
var
GetObjectContextProc: TGetObjectContextProc = nihil;
SafeRefProc: TSafeRefProc = nihil;
MtsProcsLoaded: Boolean = Salah;
prosedur LoadMtsProcs;
var
Mtxdll: HModule;
mulai
jika MtsProcsLoaded lalu Keluar;
MtsProcsLoaded := Benar;
Mtxdll := GetModuleHandle('mtxex.dll');
jika mtxdll <> 0 maka
mulai
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
akhir;
akhir;
fungsi GetObjectContext: IObjectContext;
mulai
MuatMtsProcs;
jika Ditugaskan(GetObjectContextProc) lalu
OleCheck(GetObjectContextProc(Hasil))
kalau tidak
Hasil := nil; //Mengembalikan null saat menjalankan satu langkah.
akhir;
Perhatikan bahwa unit MTX di D6 berbeda.
pelaksanaan
menggunakanComObj;
jenis
TGetObjectContextProc = fungsi(var ObjectContext: IObjectContext): HRESULT;
///
TCoGetObjectContextProc = fungsi(const riid: TGUID; var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = fungsi(const rid: TGUID; Unk: IUnknown): Pointer;
var
GetObjectContextProc: TGetObjectContextProc = nihil;
CoGetObjectContextProc: TCoGetObjectContextProc = nihil;
SafeRefProc: TSafeRefProc = nihil;
MtsProcsLoaded: Boolean = Salah;
fungsi IsComPlusPlatform: boolean; ////// Apakah itu COM+
var
Ver: TOsVersionInfo;////
mulai
Ver.dwOSVersionInfoSize := sizeof(Ver);////
GetVersionEx(Ver);
jika (Ver.dwPlatformID = VER_PLATFORM_WIN32_NT) dan///
(Ver.dwMajorVersion >= 5) lalu////
Hasil := benar //
lain Hasil := salah;
akhir; //////
prosedur LoadMtsProcs;
var
Mtxdll: HModule;
mulai
jika MtsProcsLoaded lalu Keluar;
MtsProcsLoaded := Benar;
jika IsComPlusPlatform maka ////
mulai
Mtxdll := GetModuleHandle('ole32.dll'); ///
jika mtxdll <> 0 maka ///
@CoGetObjectContextProc := GetProcAddress(Mtxdll, 'CoGetObjectContext');
akhir ///
kalau tidak
mulai
Mtxdll := GetModuleHandle('mtxex.dll');
jika mtxdll <> 0 maka
mulai
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
akhir;
akhir;
akhir;
fungsi GetObjectContext: IObjectContext;
konstanta
IID_IObjectContext: TGUID = '{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}';
mulai
MuatMtsProcs;
jika Ditugaskan(CoGetObjectContextProc) maka ///
CoGetObjectContextProc(IID_IObjectContext, Hasil) ///
lain jika Ditugaskan (GetObjectContextProc) lalu
OleCheck(GetObjectContextProc(Hasil))
kalau tidak
Hasil := nihil;
akhir;
Bagian yang ditipiskan secara diagonal adalah bagian yang banyak. Anda hanya perlu menambahkan D5 MTX ke bagian ini kemudian menyimpannya ke direktori program Anda saat ini.
Kompilasi program untuk mendapatkan ObjectContext.