يرجى أن تضع في اعتبارها أنني كنت تمسك في القش من خلال عدم وجود معلومات تحاول أن تفكر لماذا DLL الخاص بك لا يزال تحطمها على أي حال ....
نعم صحيح. لذلك يجب أن تتحمل DLL الخاص بك بعض المسؤولية عما يفعله طارئًا من الأعطالالاستخدام السيئ من قبل تطبيق الاتصاللغة الاتصال غير الموثوق بها (MQL4)أو لتسهيل استخدام تطبيق الاتصال. إذا تم إلغاء تحميل DLL وتم تنفيذ بعض من طعامك Deinit () ثم كما تقول لا يتم تحريرها الأجسام theses ذلك ... كان تجربتي (سمة غير موثقة!) - والحس السليم من شأنه دعم هذا - أن: يتم تنفيذ كل من الدالتين Init () و DeInit () في EA داخل MT4 Apps Thread. لذا يجب ألا يكون تنفيذ InitDeInit خيطًا آمنًا. يتم تنفيذ الدالة Start () فقط في مؤشر ترابط آخر. طالما أنك لا تتصل بـ Init () أو DeInit () من داخل MT4 Start () ، فسيكون كل شيء على ما يرام ، ويمكنك استخدام Tlist بسيط لهذا الغرض. هذا هو مبالغة قليلا ولكن الممارسة الجيدة على أقل تقدير. إذا لم يذكرك أي شيء آخر بالتفكير في التنظيف. حتى مع ما ورد أعلاه في الاعتبار يمكنك القيام بشيء مثل: مكتبة Codeed YourDLL؛ يستخدم SysUtils ، الطبقات. اكتب tyourobject = الفئة (tobject) الاسم الخاص: string؛ النهاية؛ var SaveExit: Pointer؛ objs: tlist؛ function YourNormal_InitObj (pairname: pchar): longint؛ STDCALL. var tmpobj: tyourobject؛ بدء tmpobj: = tyourobject.create؛ objs.Add (tmpobj)؛ tmpobj.name: = string (pairname)؛/تفعل نتيجة عنصر init أخرى: = longint (tmpobj)؛ النهاية؛ function YourNormal_DEInitObj (objptr: longint): longint؛ STDCALL. start objs.remove (pointer (objptr))؛ tyourobject (objptr). حرية. النتيجة: = 0؛ النهاية؛ إجراء LibExit. تبدأ في محاولة في حين objs.Count GT ، 0 لا تبدأ/تحرير tyourobject (objs # 91 ؛ 0 # 93 ؛). objs.delete (0)؛//تحرير//edited objs.Free؛ أخيرا ExitProc: = SaveExit؛/استعادة سلسلة نهاية الإجراء الخروج ؛ النهاية؛ export YourNormal_InitObj index 1، YourNormal_DEInitObj index 2؛ بدء SaveExit: = ExitProc؛/save سلسلة إجراءات الخروج ExitProc: =LibExit؛/install LibExit exit procedure objs: = tlist.create؛ النهاية.Originally Posted by ;