كيفية تحرير/إنهاء ملف ActiveX DLL بشكل صحيح في دلفي؟
-
05-07-2019 - |
سؤال
نحن نستخدم فئة تسمى ODNCServer هنا - عند التهيئة TAutoObjectFactory
يتم إنشاء الكائن:
initialization
pAutoObjectFactory := TAutoObjectFactory.Create(ComServer, TODNCServer, Class_ODNCServer, ciSingleInstance, tmApartment);
الآن FastMM يشكو من تسرب الذاكرة لأنه لم يتم تحرير هذا الكائن في أي مكان.إذا قمت بإضافة بيان نهائي مثل هذا
finalization
if assigned(pAutoObjectFactory) then
TAutoObjectFactory(pAutoObjectFactory).Free;
ثم يتم تحرير الكائن، ولكن بعد ينبثق مربع حوار FastMM حول تسرب الذاكرة، لذلك يبدو أن نظام التشغيل يقوم بتفريغ ملف DLL، وليس البرنامج.حالات ODNCServer
يتم إنشاؤها مثل هذا
fODNCServer := TODNCServer.Create(nil);
//register into ROT
OleCheck(
RegisterActiveObject(
fODNCServer.DefaultInterface, // instance
CLASS_ODNCServer, // class ID
ACTIVEOBJECT_STRONG, //strong registration flag
fODNCServerGlobalHandle //registration handle result
));
وتحرر هكذا:
if ((assigned(fODNCServer)) and (fODNCServerGlobalHandle <> -1)) then
begin
Reserved := nil;
OleCheck(RevokeActiveObject(fODNCServerGlobalHandle,Reserved));
fDTRODNCServerGlobalHandle := -1;
end;
FreeAndNil(fODNCServer);
لذا، هل يعرف أحد ما الذي يجب علي تغييره للتخلص من تسرب الذاكرة؟بالمناسبة، لقد حاولت أيضًا استخدام FastMM RegisterExpectedMemoryLeaks
للتسجيل وتجاهل التسرب، ولكن يبدو أن هذا لا ينجح.بالإضافة إلى ذلك، حتى لو كان ذلك مجرد حل بديل وأود أن أعرف الطريقة الصحيحة للقيام بذلك.
المحلول
لا تقلق بشأن هذاإنه ليس "تسرب" بالمعنى الدقيق للكلمة.نعم، أنت تقوم بإنشاء كائن لم يتم تحريره مطلقًا، ولكن الكلمة الأساسية هي "an".صيغة المفرد.
لن يقوم التطبيق/DLL الخاص بك "بتسريب" الذاكرة، بمعنى أنه سينشئ مثيلات عديدة لهذه الكائنات، مما يزيد من استخدام الذاكرة باستمرار.علاوة على ذلك، سيتم تنظيف الذاكرة التي يستخدمها كائن المصنع الفردي (وأشياء أخرى مثله) عند انتهاء العملية على أي حال.
إذا أظهرت الرمز الذي تستخدمه للاتصال تسجيل المتوقعMemoryLeak () قد يكون من الممكن تحديد سبب عدم نجاح حالتك المحددة.