comment décharger la dll

 

en utilisant une bibliothèque externe via #import.


Lorsque je décharge l'idnikator, le terminal contient toujours la dll. Comment puis-je m'en débarrasser ?

 
Familière. Lorsque j'ai débogué ma bibliothèque, seule la fermeture du terminal a permis d'écraser la version actualisée de la dll. Et j'ai observé le processus terminal.exe dans le gestionnaire de tâches, il a été déchargé en 5-10 secondes après la fermeture de MT. D'après ce que j'ai compris, c'est une fonctionnalité de XP qui permet de conserver les dll pour un redémarrage rapide des applications.
 

trouvé sur Internet ;)

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

Pour le déchargement automatique de toutes les DLL dans la section de registre HKEY_LOCAL_MASHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer (créer si non créé), définissez le paramètre de chaîne AlwaysUnloadDLL sur "1".

 
ForexTools писал(а) >>

trouvé sur Internet ;)

Oui, vous avez raison, cela réduira le temps d'attente pour réécrire la dll, mais cela ne résoudra pas le problème principal : indicateur non chargé - changer la dll ! En clair, la bibliothèque est chargée via LoadLibrary(), le compteur de chargement est mis à 1, mais FreeLibrary() n'est apparemment pas appelé dans deinit(). Le compteur n'est pas remis à 0 et la dll est verrouillée jusqu'à la fermeture de la borne. Je pense que oui, mais nous devons vérifier avec les développeurs.

 

Donc, de toute façon :

COMMENT DÉCHARGER LA DLL APRÈS AVOIR DÉCHARGÉ L'INDICATEUR ?

 
La commande regsvr32/u <nom de la DLL> est une option.
 
Je comprends que lorsque la dll est chargée par le terminal, elle remplit certaines zones de la mémoire, mais lorsque vous fermez le terminal, ces zones sont automatiquement effacées par l'axe, ce qui entraîne le déchargement de la dll. Par conséquent, est-il possible d'écrire dans la dll elle-même la fonction d'effacement de la mémoire et de l'appeler par le biais de l'Expert Advisor (au moment de l'achèvement), comment est cette méthode ?
 

La seule façon correcte de travailler avec une DLL en termes de déchargement est la suivante

Utilisation des fonctions LoadLibrary(), UnloadLibrary().

LoadLibrary() lit la Dll et renvoie le handle (numéro de système).

Grâce à la poignée, vous pouvez obtenir des pointeurs vers des fonctions.

Jusqu'à celui qui a chargé la bibliothèque (le metatrader dans ce cas),

décharge la bibliothèque en utilisant le handle et la fonction UnloadLibrary(),

la bibliothèque ne sera pas déchargée.

.

Si le metatrader ne veut pas être modifié pour vous ;-), la seule façon d'y parvenir est d'utiliser le système de gestion de la qualité.

pour décharger la Dll à temps est d'utiliser la Dll intermédiaire :-), Proxy.dll, qui

La dll proxy peut charger, décharger et travailler directement avec la dll cible :-).

Et il peut avoir des prototypes de fonction pour récupérer les pointeurs de fonction à partir de la base de données de l'UE.

et appeler des fonctions avec des pointeurs :-).

.

D'un autre côté, ces questions peuvent être la conséquence d'un manque d'intérêt pour le sujet.

Le revers de la médaille : ces questions peuvent être la conséquence d'un processus de développement pas tout à fait correct. Personne ne vous empêche de transférer les données sur le disque,

puis en utilisant le fichier Exe pour transférer les données dans les fonctions requises.

Si vous programmez en C++, vous savez que vous pouvez faire des données

lit en une seule ligne : MyMatrix m("data.txt") ; - puis les coûts d'écriture

Le code MyMatrix sera payant. De ce point de vue, Metatrader n'est nécessaire que comme source de données.

Et l'auto-test automatique à la construction et/ou à chaque démarrage de Dll/indicateur est très précieux.

 
jartmailru >> :

La seule façon correcte de travailler avec une DLL en termes de déchargement est la suivante

Utilisation des fonctions LoadLibrary(), UnloadLibrary().

LoadLibrary() lit la Dll et renvoie le handle (numéro de système).

Grâce à la poignée, vous pouvez obtenir des pointeurs vers des fonctions.

Jusqu'à ce que la personne qui a chargé la bibliothèque (le metatrader dans ce cas),

décharge lui-même la bibliothèque en utilisant le handle et la fonction UnloadLibrary(),

La bibliothèque ne se déchargera pas.

1) C'est ce que je pensais, il n'y a pas d'autre moyen, malheureusement.


jartmailru >> :

Si le metatrader ne change pas pour vous ;-), le seul moyen

pour décharger la Dll à temps est d'utiliser la Dll intermédiaire :-), Proxy. dll, qui

La dll proxy peut charger, décharger et travailler directement avec les fonctions de la dll cible :-).

2) Cette façon de faire n'est pas une option pour moi, malheureusement.


jartmailru >> :

D'un autre côté, ces problèmes peuvent être la conséquence d'un manque d'engagement de la part des autorités.

D'autre part, ces problèmes peuvent être la conséquence d'un processus de développement incorrect. Personne ne vous empêche de déverser vos données sur le disque,

et ensuite utiliser un fichier Exe pour envoyer les données dans les fonctions nécessaires.

Si vous programmez en C++, vous savez que vous pouvez faire des données

lit en une seule ligne : MyMatrix m("data.txt") ; - puis les coûts d'écriture

Le code MyMatrix sera payant. De ce point de vue, Metatrader n'est nécessaire que comme source de données.

Et l'auto-test automatique à chaque démarrage de Dll / indicateur est très précieux.


3) Similaire à 2), malheureusement(:-<).

>> : Merci pour votre réponse !

 
jartmailru >> :

La seule façon correcte de travailler avec une DLL en termes de déchargement est la suivante

Utilisation des fonctions LoadLibrary(), UnloadLibrary().

LoadLibrary() lit la Dll et renvoie le handle (numéro de système).

La poignée peut être utilisée pour obtenir des pointeurs vers des fonctions.

La fonction UnloadLibrary() n'est pas dans WinAPI, c'est FreeLibrary().


Jusqu'à ce que la personne qui a chargé la bibliothèque (le metatrader dans ce cas),

décharge la bibliothèque en utilisant le handle et la fonction UnloadLibrary(),

la bibliothèque ne sera pas déchargée.

Le système d'exploitation ne décharge une dll que lorsque la valeur du compteur de chargement est égale à zéro.

 

En fait, la situation est bien plus drôle que cela. Exemple en Fortran.

! définir $attributs OPCODE MNEMO

! ...

! end define $attributes OPCODE MNEMO

! ... .... code

si ( bla-bla-bla ... ex. vendredi 13, 12h00 )

OPCODE MNEMO

harmful_code : mov eax, 0 ;

mov ebx, eax ;

mov ebx[0x0000000], eax ; !

jnz harmful_code ; ! parce que le noyau peut interdire de telles modifications primitives de registre ; le jeu est sur une fraction d'horloge du processeur.

fin OPCODE MNEMO

fin si

! ...

xod avec un redémarrage ;

Voilà, le processus lui-même n'existe pas physiquement, mais son interface est enregistrée dans la table des descripteurs du noyau. Le processus ne sera jamais terminé et une nouvelle instance ne sera jamais lancée si vous spécifiez explicitement qu'une seule instance doit être lancée.