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
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 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.
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.
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.
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!
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.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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?