wie man die DLL entlädt

 

Verwendung einer externen Bibliothek über #import.


Wenn ich den Idnikator entlade, enthält das Terminal immer noch die DLL. Wie werde ich sie wieder los?

 
Vertraut. Beim Debuggen meiner Bibliothek half nur das Schließen des Terminals, um die aktualisierte DLL-Version zu überschreiben. Und ich habe den terminal.exe-Prozess im Task-Manager beobachtet, er wurde innerhalb von 5-10 Sekunden nach dem Schließen von MT entladen. Soweit ich verstanden habe, ist es eine XP-Funktion, um Dlls für einen schnellen Neustart der Anwendung zu speichern.
 

im Internet gefunden ;)

Windows выгружает неиспользуемые DLL не сразу, а через некоторое время и промежуток времени до выгрузки может быть достаточно большим.

Zum automatischen Entladen aller DLLs im Registrierungsabschnitt HKEY_LOCAL_MASHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer (erstellen, falls nicht erstellt) AlwaysUnloadDLL auf "1" setzen

 
ForexTools писал(а) >>

gefunden im Internet ;)

Ja, Sie haben Recht, es wird die Wartezeit für das Neuschreiben der Dll verkürzen, aber es wird das Hauptproblem nicht lösen: Ungeladener Indikator - ändern Sie die Dll! Offensichtlich wird die Bibliothek über LoadLibrary() geladen, der Ladezähler wird auf 1 gesetzt, aber FreeLibrary() wird offenbar nicht in deinit() aufgerufen. Der Zähler wird nicht auf 0 zurückgesetzt und die Dll ist gesperrt, bis das Terminal geschlossen wird. Ich glaube schon, aber wir müssen das mit den Entwicklern abklären.

 

Wie dem auch sei:

WIE ENTLADE ICH DIE DLL NACH DEM ENTLADEN DES INDIKATORS?

 
Der Befehl regsvr32/u <DLL-Name> ist eine Option.
 
Ich verstehe, dass die DLL beim Laden durch das Terminal bestimmte Speicherbereiche füllt, aber wenn Sie das Terminal schließen, werden diese Bereiche automatisch von der Achse gelöscht, wodurch die DLL entladen wird. Folglich ist es möglich, in der DLL selbst Funktion zu schreiben, um Speicher zu löschen und rufen Sie es durch den Expert Advisor (zum Zeitpunkt der Fertigstellung), wie ist diese Methode?
 

Der einzig richtige Weg, mit einer DLL in Bezug auf das Entladen zu arbeiten, ist

Verwendung der Funktionen LoadLibrary(), UnloadLibrary().

LoadLibrary() liest die Dll und gibt den Handle (Systemnummer) zurück.

Über das Handle können Sie Zeiger auf Funktionen erhalten.

Bis derjenige, der die Bibliothek (in diesem Fall den Metatrader) geladen hat,

entlädt die Bibliothek mit Hilfe des Handles und der Funktion UnloadLibrary(),

wird die Bibliothek nicht entladen.

.

Wenn der Metatrader nicht für Sie geändert wird ;-), ist die einzige Möglichkeit, den

um die Dll rechtzeitig zu entladen, ist die Verwendung der Zwischen-Dll :-), Proxy.dll, die

Proxy-Dlls können laden, entladen und direkt mit der Ziel-Dll arbeiten :-).

Und es kann Funktionsprototypen haben, um Funktionszeiger aus der Datenbank zu holen.

und Funktionen mit Zeigern aufrufen :-).

.

Andererseits - solche Fragen können eine Folge davon sein, dass

Die andere Seite der Medaille - solche Fragen können eine Folge eines nicht ganz korrekten Entwicklungsprozesses sein. Niemand hindert Sie daran, die Daten auf der Festplatte zu speichern,

und dann die Exe-Datei verwenden, um die Daten in die gewünschten Funktionen zu übertragen.

Wenn Sie in C++ programmieren, wissen Sie, dass Sie Daten

liest in einer Zeile: MyMatrix m("data.txt"); - dann Kosten für das Schreiben

Der MyMatrix-Code wird sich auszahlen. Unter diesem Gesichtspunkt wird Metatrader nur als Datenquelle benötigt.

Und der automatische Selbsttest bei der Erstellung und/oder bei jedem Start von Dll/Indikator ist sehr nützlich.

 
jartmailru >> :

Der einzig richtige Weg, mit einer DLL in Bezug auf das Entladen zu arbeiten, ist

Verwendung der Funktionen LoadLibrary(), UnloadLibrary().

LoadLibrary() liest die Dll und gibt den Handle (Systemnummer) zurück.

Über das Handle können Sie Zeiger auf Funktionen erhalten.

Bis die Person, die die Bibliothek (in diesem Fall den Metatrader) geladen hat,

entlädt die Bibliothek selbst mit Hilfe des Handles und der Funktion UnloadLibrary(),

Die Bibliothek wird nicht entladen.

1) Das dachte ich mir schon, leider gibt es keine andere Möglichkeit.


jartmailru >> :

Wenn sich der Metatrader für Sie nicht ändern will ;-), bleibt Ihnen nur der Weg

um die Dll rechtzeitig zu entladen, ist die Verwendung der Zwischen-Dll :-), Proxy. dll, die

Proxy-Dlls können laden, entladen und direkt mit den Funktionen der Ziel-Dlls arbeiten :-).

2) Dieser Weg kommt für mich leider nicht in Frage.


jartmailru >> :

Andererseits können solche Probleme die Folge davon sein, dass die

Andererseits können solche Probleme auch eine Folge eines fehlerhaften Entwicklungsprozesses sein. Niemand hindert Sie daran, Ihre Daten auf der Festplatte abzulegen,

und dann eine Exe-Datei verwenden, um die Daten in die erforderlichen Funktionen zu übertragen.

Wenn Sie in C++ programmieren, wissen Sie, dass Sie Daten

liest in einer Zeile: MyMatrix m("data.txt"); - dann Kosten für das Schreiben

Der MyMatrix-Code wird sich auszahlen. Unter diesem Gesichtspunkt wird Metatrader nur als Datenquelle benötigt.

Und der automatische Selbsttest bei jedem Start von Dll / Indikator ist sehr wertvoll.


3) Ähnlich wie bei 2), leider(:-<).

>> : Vielen Dank für Ihre Antwort!

 
jartmailru >> :

Der einzig richtige Weg, mit einer DLL in Bezug auf das Entladen zu arbeiten, ist

Verwendung der Funktionen LoadLibrary(), UnloadLibrary().

LoadLibrary() liest die Dll und gibt den Handle (Systemnummer) zurück.

Der Handle kann verwendet werden, um Zeiger auf Funktionen zu erhalten.

Die Funktion UnloadLibrary() gehört nicht zur WinAPI, sondern zu FreeLibrary().


Bis die Person, die die Bibliothek (in diesem Fall den Metatrader) geladen hat,

entlädt die Bibliothek mit Hilfe des Handles und der Funktion UnloadLibrary(),

wird die Bibliothek nicht entladen.

Das Betriebssystem entlädt eine DLL nur dann, wenn der Ladezähler auf Null steht.

 

In Wirklichkeit ist die Situation viel lustiger als das. Fortran-Beispiel.

! definieren $Attribute OPCODE MNEMO

! ...

! end define $Attribute OPCODE MNEMO

! ... .... code

if ( bla-bla-bla ... z.B. Freitag der 13., 12.00 Uhr )

OPCODE MNEMO

harmful_code: mov eax, 0;

mov ebx, eax;

mov ebx[0x0000000], eax; !

jnz harmful_code; ! weil der Kernel solche primitiven Registeränderungen nicht zulassen kann; das Spiel läuft auf einen Bruchteil eines Prozessortaktes.

Ende OPCODE MNEMO

Ende wenn

! ...

xod mit einem Neustart;

Der Prozess selbst existiert physisch nicht, aber seine Schnittstelle ist in der Kernel-Deskriptor-Tabelle registriert. Der Prozess wird nie beendet und es wird nie eine neue Instanz gestartet, wenn Sie ausdrücklich angeben, dass nur eine Instanz gestartet werden soll.