عند كتابة مكونات COM+ في دلفي5، لا يمكن دائمًا الحصول على ObjectContext
أي أن استدعاء GetObjectContext يُرجع صفرًا، وهذا يمنع معالجة المعاملات من أن تكون صحيحة.
تم. طلب مني أحد الأشخاص على الإنترنت إضافة سطر قبل مكون COM+ لتحميل mtxex.dll
إنه يحل هذه المشكلة، ولكن يبدو أنه يعمل بشكل غير مستقر.
الإجراء TgEntityObj.Initialize;
يبدأ
موروث؛
LoadLibrary('mtxex.dll');
نهاية؛
لكن يمكنني الحصول على ObjectContext في Delphi6 دون إضافة هذا البيان.
لقد رأيت أن وحدة MTX الموجودة في كاميرا D6 تختلف بالفعل عن كاميرا D5، ولا يمكنني إلقاء اللوم على بورلاند في هذا الأمر.
عندما تم إصدار D5، لم يكن WIN2000 (COM+) قد تم إصداره بعد، لذلك كانت وحدة MTX في D5 لا تزال محملة.
كيف تكتب MTS.
الخط 253 في وحدة D5 MTX.
تطبيق
this.usesComObj;
يكتب
TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT cdecl;
TSafeRefProc = function(constrid: TGUID; Unk: IUnknown): المؤشر cdecl;
فار
GetObjectContextProc: TGetObjectContextProc = nil;
SafeRefProc: TSafeRefProc = nil;
MtsProcsLoaded: Boolean = False;
إجراء LoadMtsProcs;
فار
Mtxdll: HModule;
يبدأ
إذا MtsProcsLoaded ثم خروج؛
MtsProcsLoaded := صحيح;
Mtxdll := GetModuleHandle('mtxex.dll');
إذا mtxdll <> 0 ثم
يبدأ
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
نهاية؛
نهاية؛
وظيفة GetObjectContext: IObjectContext؛
يبدأ
this.LoadMtsProcs;
إذا تم تعيينه (GetObjectContextProc) بعد ذلك
OleCheck(GetObjectContextProc(النتيجة))
آخر
النتيجة: = لا شيء؛ // يُرجع قيمة فارغة عند تنفيذ خطوة واحدة.
نهاية؛
لاحظ أن وحدة MTX في D6 مختلفة.
تطبيق
this.usesComObj;
يكتب
TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT cdecl;
///
TCoGetObjectContextProc = function(const riid: TGUID; var ObjectContext: IObjectContext): HRESULT;
TSafeRefProc = function(constrid: TGUID; Unk: IUnknown): المؤشر cdecl;
فار
GetObjectContextProc: TGetObjectContextProc = nil;
CoGetObjectContextProc: TCoGetObjectContextProc = nil;
SafeRefProc: TSafeRefProc = nil;
MtsProcsLoaded: Boolean = False;
وظيفة IsComPlusPlatform: منطقية ////// سواء كانت COM+
فار
الإصدار: TOsVersionInfo;////
يبدأ
Ver.dwOSVersionInfoSize := sizeof(Ver);////
GetVersionEx(Ver);
إذا (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}' ///
يبدأ
this.LoadMtsProcs;
إذا تم تعيينه (CoGetObjectContextProc) ثم ///
CoGetObjectContextProc(IID_IObjectContext، النتيجة) ///
وإلا إذا تم تعيينه (GetObjectContextProc) بعد ذلك
OleCheck(GetObjectContextProc(النتيجة))
آخر
النتيجة := لا شيء؛
نهاية؛
الأجزاء الرقيقة قطريًا هي الأجزاء العديدة، ما عليك سوى إضافة D5 MTX إلى هذه الأجزاء ثم حفظها في الدليل الحالي لبرنامجك.
ترجمة البرنامج للحصول على ObjectContext.