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".
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 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.
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.
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.
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 !
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.
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
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 ?