comment décharger la dll - page 4

 
OneDepo >> :

Oui, vous avez raison, cela réduira le temps d'attente pour la réécriture de la dll, mais cela ne résoudra pas le problème principal : indicateur non chargé - changez 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.

Qui vous empêche (à l'exception de certains participants de cette branche) de faire

#import "kernel32.dll".

int GetModuleHandleA ( string sss ) ;
void FreeLibrary(int hhh) ;
#import


deinit()

{

handlissimo=GetModuleHandleA("test-dll.dll") ;

FreeLibrary(handlissimo) ;

}


? ??

Vous pouvez remplir vous-même les paramètres des fonctions. Pour supprimer TOTALEMENT de la mémoire toutes les DLL libérées de cette façon - en raison des limitations de metatrader.exe et en raison de la mise en cache forte de vinda mentionnée précédemment par moi (qui inclut la substitution des fichiers dll protégés de dllcache) - utilisez regsvr32.

Je vois que TheExpert est lié à MetaQuotes.

 

Note : parfois, même regsvr32 ne décharge pas la DLL, et Windows remplit une ancienne version. La pratique montre qu'une seule DLL peut rester en mémoire pendant des SEMAINES. Dans ce cas, seul le redémarrage est utile. Si vous ne voulez pas redémarrer, des moyens semi-hackers vous aideront, comme Process Explorer. Il peut décharger de la mémoire n'importe quoi et n'importe où - contrairement à ce que prétendent les professionnels de ce forum (et charger aussi, ha ha, mais vous n'en avez pas besoin).

http://www.softpedia.com/get/System/System-Info/Process-Explorer.shtml

courte description et plugin :

http://rootkits.su/app/ShowApp.aspx?id_a=36

 

Je vois que vous êtes toujours là. Très bien. Voici ce que MS lui-même nous dit à propos de regsvr32 :


Outil Regsvr32 : utilisation et messages d'erreur


"L'outil Regsvr32 (Regsvr32.exe) est conçu pour enregistrer et désenregistrer les contrôles OLE, tels que les fichiers DLL ou OCX enregistrés automatiquement. Cela peut s'avérer nécessaire lors du dépannage de certains problèmes du système Windows, de Microsoft Internet Explorer et d'autres programmes. Par exemple, selon l'article de la base de connaissances Microsoft ci-dessous, l'outil Regsvr32.exe doit être utilisé pour désenregistrer le contrôle Wuv3is.dll avant de le réinstaller à partir du site Web du Centre de mise à jour Windows.


plus :

"L'utilitaire regsvr32.exe est utilisé pour enregistrer les DLL et les contrôles ActiveX dans le registre de Windows. Il peut également être utilisé pour supprimer les incohérences entre les fichiers DLL."

 
HideYourRichess >> :

Je vois que vous êtes toujours là. Très bien. Voici ce que MS lui-même nous dit à propos de regsvr32 :


Outil Regsvr32 : Utilisation et messages d'erreur


"Regsvr32 (Regsvr32.exe) est utilisé pour enregistrer et désenregistrer les contrôles OLE comme les fichiers DLL ou OCX enregistrés automatiquement. Cela peut s'avérer nécessaire lors du dépannage de certains problèmes du système Windows, de Microsoft Internet Explorer et d'autres programmes. Par exemple, selon l'article de la base de connaissances Microsoft ci-dessous, l'outil Regsvr32.exe doit être utilisé pour désenregistrer le contrôle Wuv3is.dll avant de le réinstaller à partir du site Web du Centre de mise à jour Windows".


plus :

"L'utilitaire regsvr32.exe est utilisé pour enregistrer les DLL et les contrôles ActiveX dans le registre de Windows. Il peut également être utilisé pour supprimer les incohérences entre les fichiers DLL."

Eh bien, oncle hacker, tu devrais déjà avoir deviné dans ta dernière phrase comment regsvr32 fonctionne pour nous :


http://support.microsoft.com/kb/207132

RegSvr32.exe appelle les fonctions Win32 suivantes dans cet ordre :

* OleInitialize
* LoadLibrary pour charger la DLL.
* DllRegisterServer ou DllUnregisterServer
* FreeLibrary
* OleUninitialize

http://msdn.microsoft.com/en-us/library/ms683152(VS.85).aspx
Fonction FreeLibrary

Libère le module de bibliothèque à liaison dynamique (DLL) chargé et, si nécessaire, diminue son nombre de références.
Lorsque le nombre de références atteint zéro, le module est déchargé de l'espace d'adressage de la machine appelante.
et l'identifiant n'est plus valide.

C'est-à-dire que regsvr32 charge et libère la bibliothèque. Mais contrairement à terminal.exe, qui, seul ou avec une solution simple et élégante que j'ai suggérée plus haut, libère la bibliothèque, MAIS CONTINUE DE RESTER DANS LA MÉMOIRE, (donnant à Windows des raisons de ne pas décharger la bibliothèque pour l'instant et de laisser un autre processus le faire) - contrairement à metatrader qui reste en mémoire, l'utilitaire de ligne de commande regsvr32.exe arrête son processus et sort de la mémoire, ce qui indique à Windows de décharger complètement la bibliothèque de la mémoire.

Une bibliothèque peut être déchargée sans utiliser regsvr32, mais c'est la roulette. Certaines personnes aiment la roulette, la plupart des pros ne l'aiment pas, c'est une question de niveau de développement.

Si la bibliothèque est simple et ne s'accroche pas à BEAUCOUP d'autres bibliothèques, elle PEUT se décharger rapidement. Mais si la bibliothèque est complexe, qu'elle comporte des bases de données et des contrôles exotiques, son déchargement peut prendre des minutes, voire des heures.

À propos, concernant le paramètre AlwaysUnloadDLL - Microsoft lui-même affirme que cela ne fonctionnait que jusqu'en 2000 (à l'époque et aujourd'hui, des algorithmes complexes étaient appliqués pour calculer "le besoin d'une DLL") :

http://msdn.microsoft.com/en-us/library/bb776795(VS.85).aspx

Déchargement de la DLL

Le shell décharge automatiquement une DLL lorsque son compte d'utilisation est égal à zéro, mais uniquement lorsque la DLL n'a pas été utilisée pendant un certain temps. Cette période d'inactivité peut parfois être d'une longueur inacceptable, notamment lorsqu'une DLL d'extension Shell est en cours de débogage. Pour les systèmes d'exploitation antérieurs à Windows 2000, vous pouvez raccourcir la période d'inactivité en ajoutant les informations suivantes au registre.

  • HKEY_LOCAL_MACHINE
  • Logiciel
  • Microsoft
  • Windows
  • Version actuelle
  • Explorer
  • AlwaysUnloadDll
 

Comme je souffre encore d'un mauvais rhume (mais attention, même alité avec de la fièvre, j'aide gratuitement les gens à résoudre leurs problèmes de terminal.exe, c'est-à-dire à résoudre exclusivement leurs problèmes d'argent), je peux dire aux personnes intéressées (et aussi aux étudiants non informés des écoles professionnelles) à quel point il est difficile de travailler en tant que sysadmin dans les grandes entreprises à distance.

Toute grande entreprise utilise des outils UNIVERSELS. Cela signifie que tous les serveurs - locaux et globaux exécutent Eorakl, sur toutes les stations de travail utilisent le même programme de la même version de la liaison Office, Excel-ou programme analytique avec Eorakl ou MS SQL Server, certains "dbconnect.dll". Et puis un jour "merveilleux" pour les sysadmins les développeurs déboguent enfin une nouvelle version du programme et tous les sysadmins locaux (dans la société de la première centaine - les sysadmins peuvent être 500-800, 1,250 Terabyte de mémoire de disque dur, 130 nœuds NCR, 145 systèmes de serveur Unix et 2600 serveurs Windows, 80.000 utilisateurs de courrier dans plus de 2.000 sites d'entreprise) vient un ordre de REMPLACER "demain" ce programme. Le programme est complexe, il utilise beaucoup de choses, le réécrire simplement sur l'ordinateur ne fonctionnera pas. Et il est nécessaire de redémarrer l'ordinateur après regsvr32 - si l'administrateur système a le temps de le faire.

Ce remplacement ne peut être effectué que de 18h00 à 24h00, car jusqu'à 18h00, les employés de bureau travaillent encore sur les ordinateurs, et à 24h00, le serveur commence à travailler sur Yorakla, les stations commencent à mettre à jour automatiquement Windows et à mettre à jour automatiquement l'antivirus. Il existe des moyens pour démarrer à distance regsvr32 et surcharger la station sans aller à la station, mais ils ne fonctionnent pas toujours, (Pare-feu activé, utilisateur non logué, etc.). Et les ordinateurs des administrateurs système locaux peuvent être au nombre de 50 à 100, éloignés les uns des autres, à des étages différents et dans des bureaux déjà fermés.

Donc les sysadmins font le tour du bâtiment de l'entreprise et lancent regsvr32 à la main.

 

Regsvr32 est conçu pour enregistrer et désenregistrer les serveurs COM.

Il ne s'agit pas de toutes les dlls. C'est une sorte spéciale de dll. Il n'est pas nécessaire d'appeler Regsvr32.

Il suffit d'appeler FreeLibrary comme indiqué ci-dessus ou de ne pas utiliser "#import" mais d'utiliser la paire :

LoadLibrary, FreeLibrary.

Au fait, mes dlls sont pour une raison quelconque libérées immédiatement après la suppression de l'indicateur.

 

En fait, personnellement, j'écris pour ceux qui savent lire le russe et l'anglais. Des gens étranges, ils répètent pour la dixième fois ici POURQUOI regsvr32 a été créé. Ils le chantent comme un mantra, comme un sort, tandis que d'autres ne savent pas pourquoi. Et quelle importance si regsvr32 fait ce que nous avons besoin qu 'il fasse et n'a pas d'effets secondaires ?

C'est comme si un ambulancier ou un médecin de soins intensifs prescrivait de l'hyposulfite de sodium à un alcoolique (un "avancé" comme ça).

http://drugslist.ru/drugs/antichlor-sodium-thiosulfate/

et il se met à crier qu'il ne le boira pas parce que ..... est un fixateur de photos et qu'ils veulent l'empoisonner !

http://www.rwwc.ru/recipe/index6.php

S'il y a tant de personnes intelligentes ici, qu'elles indiquent un AUTRE utilitaire standard, disponible sur n'importe quel ordinateur, qui chargerait et déchargerait immédiatement N'IMPORTE QUELLE BIBLIOTHÈQUE que vous voudriez, de manière à réinitialiser la mise en cache des DLL par Windows de cette manière.

 
AlexEro >> :

...

Pour la dixième fois, ils répètent ici POURQUOI regsvr32 a été créé. Quelle importance si regsvr32 fait ce dont nous avons besoin et n'a pas d'effets secondaires ? Ils le chantent comme un mantra, comme un sort.

C'est comme si un ambulancier ou un médecin des urgences prescrivait de l'hyposulfite de sodium à un alcoolique (un "avancé" comme ça).

...

Tout cela est très important. Si vous faites des analogies médicales, ce que vous écrivez ici revient à traiter une tête malade avec une hache.


AlexEro >> :

...

Le déchargement de la bibliothèque peut se faire SANS utiliser regsvr32, mais c'est la roulette. Certaines personnes aiment la roulette, la plupart des pros ne l'aiment pas, c'est une question de niveau de développement.

Si la bibliothèque est simple et ne s'accroche pas à BEAUCOUP d'autres bibliothèques, elle PEUT se décharger rapidement. Mais si la bibliothèque est complexe, qu'elle comporte des bases de données et des contrôles exotiques, son déchargement peut prendre des minutes, voire des heures.

...


Vous ne comprenez tout simplement pas comment le mécanisme de chargement/déchargement des dll fonctionne en principe, c'est pourquoi vous avez des fantasmes aussi malsains à ce sujet. Vous ne devriez pas utiliser regsvr32, il n'est pas prévu pour cela, et vous ne devriez pas essayer de décharger la bibliothèque dans deinit avec FreeLibrary, la bibliothèque devrait être déchargée par elle-même, si elle n'a pas d'erreurs grossières bien sûr. Votre "solution simple et élégante" est un non-sens. Cela ne fonctionnera pas dans de nombreux cas, notamment si des blocages se produisent dans la DllMain.


Je le répète, la seule façon normale et correcte de décharger une dll est d'écrire la dll elle-même sans erreur. Si la dll n'est pas déchargée normalement - alors les mains du codeur sont mauvaises (à savoir le codeur, dans le terminal lui-même tout est fait correctement) - c'est tout. Je décharge toujours, je répète, toujours les dll normalement, immédiatement après le retrait de l'indicateur. Et c'est exact, c'est ainsi que cela a été conçu dans le terminal.


Et vous essayez en vain de donner du poids à votre fiction en vous référant à votre expérience d'administrateur système. Nous avons déjà découvert que vous n'êtes pas un administrateur système très intelligent, alors cela semble très enfantin, ridicule.

 
HideYourRichess >> :
Vous ne comprenez tout simplement pas comment le mécanisme de chargement/déchargement des dll fonctionne en principe, c'est pourquoi vous avez des fantasmes aussi malsains sur ce sujet..... (Vous ne devriez pas non plus essayer de décharger une bibliothèque pour la désinitialiser en utilisant FreeLibrary, la bibliothèque devrait être déchargée par elle-même, s'il n'y a pas d'erreurs grossières dedans bien sûr. Votre "solution simple et élégante" est un non-sens. Cela ne fonctionnera pas dans de nombreux cas, notamment si des blocages se produisent dans la DllMain.
Tonton hacker, il n'y a aucune logique dans vos propos : si la bibliothèque est TOUJOURS et TOUJOURS déchargée, pourquoi "mon" appel à FreeLibrary selon vous "ne fonctionnera pas dans de nombreux cas" ? Quel mal pourrait-on faire d'un appel supplémentaire à FreeLibrary dans le bloc deinit() ? Selon vous, le fait d'appeler FreeLibrary() bloquerait-il en quelque sorte la libération de la bibliothèque ? Ce n'est pas clair, oncle kool hacker, et c'est évident.
 
AlexEro >> :
Oncle Hacker, il n'y a aucune logique dans ce que tu dis.

1ère question - comment le système sait-il à partir de quels processus décharger la dll ?

Question 2 - comment trouver le point d'entrée sans charger la dll ?


Maintenant, essentiellement. La dll est chargée et déchargée pendant regsvr pour un enregistrement correct. Et bien sûr, cela n'a aucun effet sur le déchargement d'autres processus.

N'essayez pas de paraître plus stupide que vous ne l'êtes. Vous pouvez lire le mana, cependant.

Si la bibliothèque s'est TOUJOURS déchargée, pourquoi "mon" appel à FreeLibrary selon vous "ne fonctionnera pas dans de nombreux cas" ? Quel mal pourrait-on faire d'un appel supplémentaire à FreeLibrary dans un bloc deinit() ? Peut-être que votre appel à FreeLibrary() bloquera d'une manière ou d'une autre la libération de la bibliothèque, ou quoi ? Oncle kool hacker, et un bon en plus.

C'est évident. En plus du déchargement de la dll, la mise en œuvre de la désinitialisation de l'indicateur (expert) peut être tout ce qui lui est directement lié, ce qui transforme la libération non autorisée de la dll en un hack, qui à son tour ne garantit pas le bon fonctionnement du terminal.


>> Alors, bonne chance, continuez à essayer.

2All : ne pensez pas à l'engager comme administrateur.