wie man die DLL entlädt - Seite 5

 
TheXpert >> :

1. Frage: Woher weiß das System, von welchen Prozessen die DLL entladen werden soll?

Frage 2 - wie finde ich den Einstiegspunkt, ohne die DLL zu laden?


Nun, im Wesentlichen. Die DLL wird während regsvr geladen und entladen, um eine korrekte Registrierung zu ermöglichen. Dies hat natürlich keine Auswirkung auf das Entladen aus anderen Prozessen.

Versuchen Sie nicht, dümmer zu klingen als Sie sind. Aber es gibt eine gute Sache, Sie können Mana lesen.

Offensichtlich. Neben dem Entladen der DLL bei der Implementierung der Deinitialisierung des Indikators (Expert Advisor) kann alles, was direkt damit zusammenhängt, dazu führen, dass die unerlaubte Freigabe der DLL in die Kategorie der Hacks fällt, was wiederum die korrekte Funktion des Terminals nicht garantiert.


Alles in allem - Sie werden nicht beweisen können, dass Sie kein Dummkopf sind, viel Glück, versuchen Sie es weiter.

2Alles: Denken Sie nicht daran, ihn als Verwaltungsangestellten einzustellen.

А? Wie?

Jemand, der das versteht, möge dies bitte in die menschliche Sprache übersetzen.

(nein, ich habe mich vorhin geirrt, TheExpert kann kein Angestellter einer Firma wie MetaQuotes sein, nur eine meiner Antworten wurde sehr schnell gelöscht).

 
AlexEro >> :
Onkel Hacker, deine Worte entbehren jeglicher Logik: Wenn die Bibliothek IMMER entladen ist, warum funktioniert "mein" FreeLibrary-Aufruf deiner Meinung nach "in vielen Fällen nicht"? Welcher Schaden könnte durch einen zusätzlichen FreeLibrary-Aufruf im deinit()-Block entstehen? Würde der Aufruf von FreeLibrary() Ihrer Meinung nach irgendwie die Freigabe der Bibliothek oder etwas blockieren? Das ist nicht klar, Onkel Kool Hacker, und es ist offensichtlich.

Das ist nicht schwer zu verstehen. Wenn die Dll selbst nicht richtig entladen wird, dann haben Sie schlechte Karten und haben einen Fehler im Dll-Code gemacht (und höchstwahrscheinlich in der DllMain oder in maskierten Exaps). Dies ist der einzige Grund, es gibt keine anderen, da sowohl Windows als auch Terminal extrem loyal gegenüber der DLL sind. Nun zur FreeLibrary, die die MT4-Entwickler vor den bösen Händen anmaßender Administratoren versteckt haben. Wenn der DLL-Code korrekt ist - ist der Aufruf dieser Funktion unnötig, und dies kann übrigens aus der Dokumentation für das Terminal verstanden werden, da alles von selbst entladen wird. Wenn der Code jedoch falsch ist, wie in Ihrem Fall, kann FreeLibrary zu einer Blockierung und/oder zum Absturz des Terminals führen. Beachten Sie, dass FreeLibrary das Entladen in Fehlersituationen nicht garantiert. Manchmal kann FreeLibrary helfen, und manchmal kann das Gegenteil die Situation verschlimmern. Da es sich um eine Lotterie handelt, ist es nicht empfehlenswert, diese Funktion in diesem Fall zu verwenden. Es wird empfohlen, dass Sie einen guten Code schreiben. Wenn Sie das nicht können, kann Ihnen Ihr Dolly natürlich nicht helfen. Das ist wahr.


Eigentlich ist es hier schon oft gesagt worden, vielleicht sollte man wirklich aufhören, die Rolle eines weiteren Forumsidioten zu spielen.

 
HideYourRichess >> :

Das ist nicht schwer herauszufinden. Wenn die Dll selbst nicht entladen wird, wie es sein sollte, dann haben Sie ein schlechtes Blatt und machte einen Fehler in der Dll-Code, (und höchstwahrscheinlich in der DllMain, oder maskiert exapses). Dies ist der einzige Grund, es gibt keine anderen, da sowohl Windows als auch Terminal extrem loyal gegenüber der DLL sind. Nun zur FreeLibrary, die die MT4-Entwickler vor den bösen Händen anmaßender Administratoren versteckt haben. Wenn der DLL-Code korrekt ist - ist der Aufruf dieser Funktion unnötig, und dies kann übrigens aus der Dokumentation für das Terminal verstanden werden, da alles von selbst entladen wird. Wenn der Code jedoch falsch ist, wie in Ihrem Fall, kann FreeLibrary einen Deadlock verursachen und/oder das Terminal zum Absturz bringen. Beachten Sie, dass FreeLibrary das Entladen in Fehlersituationen nicht garantiert. Manchmal kann FreeLibrary helfen, und manchmal kann das Gegenteil die Situation verschlimmern. Da es sich um eine Lotterie handelt, ist es nicht empfehlenswert, diese Funktion in diesem Fall zu verwenden. Es wird empfohlen, dass Sie einen guten Code schreiben. Wenn Sie das nicht können, kann Ihnen Ihr Dolly natürlich nicht helfen. Das ist wahr.


Eigentlich ist es hier schon oft gesagt worden, vielleicht sollten Sie besser aufhören, die Rolle des Forumsnarren zu spielen.

Onkel Hacker, normalerweise ist es in einem solchen Moment üblich (selbst in großen Fernverkehrsunternehmen) zu fragen: "Was rauchen Sie da?", aber ich werde höflicher fragen:

Onkel Hacker, hast du Mark Twains "Wie ich eine landwirtschaftliche Zeitung herausgab" gelesen? Haben Sie? Dort schreibt der Zeitungsredakteur über das Pflücken von Steckrüben von Bäumen, ohne zu wissen, was eine Steckrübe ist.

 

Es ist doch auch ein billiger Trick, "Autoritäten" wie Mark Twain auf seine Seite zu ziehen.


Geben Sie zu, dass Sie nicht wissen, was eine DLL ist und wie sie funktioniert.


Was gibt es da nicht zu verstehen? Sind Sie ein schlechter Admin und ein schlechter Dll-Schreiber?

 
HideYourRichess >> :

Kommen Sie, es ist derselbe billige Trick, zu versuchen, "Autoritäten" wie Mark Twain auf seine Seite zu ziehen.


Geben Sie zu, dass Sie nicht wissen, was eine DLL ist und wie sie funktioniert.


Oh, so funktioniert das also? Ja, aber Onkel Hacker, sogar Microsoft selbst weiß das nicht und/oder weiß nicht, wie man es beheben kann! Bei den Profis heißt das "DLL HELL". Haben Sie es noch nicht gehört? Hier ist der Link von wikipedia:

https://en.wikipedia.org/wiki/Dll_hell

Am Ende der Seite finden Sie eine Reihe weiterer Links, darunter auch einige von Microsoft.

Es freut mich zu wissen, Onkel, dass ich in diesem Forum praktisch jemanden getroffen habe, der weiß, wie das alles funktioniert und wie man damit umgeht.

 

Dll Hell ist ein altbekanntes Problem, und die Möglichkeiten, es auf Benutzerebene zu lösen, sind wohlbekannt.


Aber versuchen Sie zu erklären, wie dieses Problem mit dem Terminal zusammenhängt?


Ich vermute, dass Sie dieses Wiki überflogen haben und das Problem immer noch nicht verstehen. Nur für den Fall, dass ich Sie daran erinnern möchte: "Der Kern des Problems ist ein Konflikt der DLL-Versionen, die bestimmte Funktionen unterstützen sollen. Die DLL-Hölle ist ein Beispiel für ein schlechtes Programmierkonzept, das wie eine versteckte Mine dazu führt, dass die Schwierigkeiten mit der Komplizierung und Verbesserung des Systems stark zunehmen" (ich habe die Beschreibung aus dem russischen Wiki übernommen, da die Russen unsere Diskussion verfolgen).


Wie hängt Dll Hell also mit dem Terminal zusammen? Und wie können regsvr32 oder FreeLibrary gegen dieses Problem helfen?

 
HideYourRichess >> :

Die Dll-Hölle ist ein altbekanntes Problem, und die Möglichkeiten, es auf Benutzerebene zu lösen, sind gut bekannt.


Aber versuchen Sie zu erklären, wie dieses Problem mit dem Terminal zusammenhängt?


Ich habe die Vermutung, dass Sie dieses Wiki durchgeblättert haben und das Problem immer noch nicht verstanden haben.


Wie hängt Dll Hell also mit dem Terminal zusammen? Und wie können regsvr32 oder FreeLibrary gegen dieses Problem helfen?

Wiederum allgemeine Phrasen und keine konkreten Angaben, nur abfällige Bemerkungen. Die DLL-Hölle steht nicht in direktem Zusammenhang mit dem Problem, sondern nur mit Ihrer Behauptung, dass Sie alles über DLL wissen, dass es keine Probleme gibt und dass jeder, der schlau ist, JEGLICHE Probleme mit DLL durch sorgfältiges Studium irgendeines unbenannten Docks vermeiden kann. Ich habe die restlichen Fragen zum obigen Problem beantwortet, mit Zitaten und Links. Im Gegensatz zu Ihnen.

 
AlexEro >> :

Auch hier wieder nur allgemeine Phrasen und keine konkreten Angaben, nur Groll. Die DLL-Hölle steht nicht in direktem Zusammenhang mit dem Problem, sondern bezieht sich nur auf Ihre Aussage, dass Sie alles über DLL wissen, dass es keine Probleme gibt und dass jeder, der nicht durch gedankenvolles Studium irgendeiner unbenannten Doku dumm ist, JEDE Probleme mit DLL vermeiden kann. Ich habe die restlichen Fragen zum obigen Problem beantwortet, mit Zitaten und Links. Im Gegensatz zu Ihnen.

Sind Sie beleidigt?! Kommen Sie, nehmen Sie sich ein Beispiel an mir, ich achte nicht auf Ihre kleinlichen, billigen Versuche, Ihren Gesprächspartner zu demütigen.


Und es gibt wirklich nichts Kompliziertes an dll, wenn man weiß, auf welche Harke man nicht treten sollte, vor allem ist es einfach in der Umsetzung, die die Mega-Quoten bieten.


Sie wollen nicht zugeben, dass die einzige Möglichkeit, Probleme mit der dll zu vermeiden, darin besteht, diese dll fachkundig zu schreiben - das ist dumm. Es ist unmöglich zu verstehen, welche Referenzen Sie hier brauchen.

 

Nach meiner persönlichen Erfahrung gibt es keine Probleme mit dynamischen Bibliotheken (wenn man in Delphi und C++ schreibt). Ich habe sie sofort freigegeben, nachdem ich die Indikatoren, die sie verwendeten, deaktiviert hatte. Ein schnelles Abklemmen des Blinkers + Austausch der Dll war immer erfolgreich.

Ich würde FreeLibrary nicht verwenden, nur weil mein Code LoadLibrary nicht explizit aufruft - ich werde nicht die Fehler von jemand anderem beheben (wenn sie reproduzierbar sind und nicht mit meinem Code zusammenhängen - es ist einfacher, die Entwickler zu informieren).

Ich bezweifle stark, dass dieses Problem auf einen nicht korrekt funktionierenden Code von Drittanbietern (Windows oder mt) zurückzuführen ist.

 

Grüße an alle!

Das Thema wurde interessant und beschlossen, das diskutierte Thema auf ein einfaches Beispiel, das mit dem Terminal( DLLSampleProjekt ) kommt zu überprüfen.

Nach dem Kompilieren in VS 6.0 arbeitet die gebackene dll erfolgreich mit dem Terminal, aber entlädt sich nicht!

Hier ist die Hauptfunktion:

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  {
//----
   switch( ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
//----
   return(TRUE);
  }

Und nun eine Frage an Kenner, die wirklich verstehen, wie die dll ist und arbeitet unter dem Wind und wissen, wie man es richtig in einem Projekt unter VS 6.0 (zum Beispiel) kompilieren.

Ist der Prototyp der Hauptfunktion korrekt?

Wie verwaltet man Ströme ATTACH/DETACH?

Wo kann man darüber nachlesen, am besten mit Beispielen?