Houd er rekening mee dat ik de rietjes vasthield door een gebrek aan informatie en probeerde te bedenken waarom je DLL nog steeds crashte ...
Ja juist. Dus uw DLL moet enige verantwoordelijkheid nemen voor wat het doet in geval van crashesSlecht gebruik door de aanroepende appOnbetrouwbare oproeptaal (MQL4)Of om het gebruik van de aanroepende app te vergemakkelijken. Als de DLL wordt verwijderd en een deel van jein Deinit () niet is uitgevoerd, zoals je zegt, zullen deze objecten niet worden vrijgegeven, dus ... Het is mijn ervaring (niet-gedocumenteerde functie!) - en gezond verstand zou dit ondersteunen - dat: Zowel de Init () en DeInit () functies in een EA worden uitgevoerd in de Main MT4 Apps Thread. Dus uw InitDeInit-implementatie hoeft niet thread safe te zijn. Alleen de functie Start () wordt uitgevoerd in een andere thread. Zolang u Init () of DeInit () niet vanuit uw MT4 Start () -functie belt, zal alles OK zijn en u kunt hiervoor een eenvoudige Tlist gebruiken. Dit is een beetje overdreven maar een goede oefening niettemin. Als niets anders het doet, moet je eraan denken om na te denken over opruimen. Dus met het bovenstaande in gedachten zou je iets kunnen doen als: Ingevoegd codebibliotheek YourDLL; gebruikt SysUtils, Classes; type tyourobject = class (bijvoeglijk naamwoord) private name: string; einde; var SaveExit: Pointer; objs: tlist; function YourNormal_InitObj (paarnaam: pchar): longint; STDCALL; var tmpobj: tyourobject; begin tmpobj: = tyourobject.create; objs.Add (tmpobj); tmpobj.name: = string (paarnaam);/het resultaat van andere init-bestanden: = longint (tmpobj); einde; function YourNormal_DEInitObj (objptr: longint): longint; STDCALL; begin objs.remove (pointer (objptr)); tyourobject (objptr) .Gratis; resultaat: = 0; einde; procedure LibExit; begin probeer terwijl objs.Count gt; 0 begin//edited tyourobject (objs # 91; 0 # 93. gratis; objs.delete (0);//bewerkt einde;//bewerkte objs.Free; finally ExitProc: = SaveExit;/herstel exit keten keten einde; einde; exporteert YourNormal_InitObj index 1, YourNormal_DEInitObj index 2; start SaveExit: = ExitProc;/exit-procedure keten opslaan ExitProc: = @LibExit;/installeer LibExit exit-procedure objs: = tlist.create; einde.Originally Posted by ;