如何卸载dll - 页 4

 
OneDepo >> :

是的,你是对的,这将减少重写dll的等待时间,但它不能解决主要问题:未加载的指标--改变dll!显然,库是通过LoadLibrary()加载的,加载计数器被设置为1,但FreeLibrary()显然没有在deinit()中调用。计数器不会被重置为0,并且dll被锁定,直到终端被关闭。我想是的,但我们需要向开发商核实。

谁能阻止(除了本支部的一些参与者)你做

#import "kernel32.dll".

int GetModuleHandleA ( string sss);
空白的FreeLibrary(int hhh)。
##进口


deinit()

{

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

FreeLibrary(handlissimo) ;

}


???

你可以自己填入函数参数。由于metatrader.exe的限制和我之前提到的vinda的强大缓存(包括从dllcache中替换受保护的dll文件),要从内存中完全删除所有以这种方式释放的DLL--使用regsvr32。

我看到TheExpert与MetaQuotes有关。

 

注意:有时即使是regsvr32也不会卸载DLL,Windows会填入一个旧版本。实践表明,一个DLL可以在内存中停留数周之久。在这种情况下,只有电脑超载才会有帮助。如果你不想重启,半黑客的方式会有帮助,如进程浏览器。它可以从任何地方的记忆中卸下任何东西--与本论坛上的职业主义者声称的相反(也可以加载,哈哈,但你不需要它)。

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

简短描述和插件。

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

 

我看到你还在继续努力。好的。下面是MS自己告诉我们的关于regsvr32的情况。


Regsvr32工具:用法和错误信息


"Regsvr32工具(Regsvr32.exe)被设计用来注册和取消注册OLE控件,如自动注册的DLL或OCX文件。在排除Windows系统、Microsoft Internet Explorer和其他程序中的一些问题时,这可能是必要的。例如,根据下面的微软知识库文章,在从Windows更新中心网站重新安装Wuv3is.dll控件之前,应使用Regsvr32.exe工具来取消注册。


更多

"regsvr32.exe工具被用来在Windows注册表中注册DLLs和ActiveX控件。它还可以用来消除DLL文件之间的不一致"。

 
HideYourRichess >> :

我看到你还在继续努力。好的。下面是MS自己告诉我们的关于regsvr32的情况。


Regsvr32工具:使用方法和错误信息


"Regsvr32(Regsvr32.exe)是用来注册和取消注册OLE控件,如自动注册的DLL或OCX文件。在排除Windows系统、Microsoft Internet Explorer和其他程序中的一些问题时,这可能是必要的。例如,根据微软知识库文章下面的Regsvr32.exe工具,在从Windows更新中心网站重新安装Wuv3is.dll控件之前,应使用该工具取消注册"。


更多

"regsvr32.exe工具被用来在Windows注册表中注册DLLs和ActiveX控件。它也可用于消除DLL文件之间的不一致"。

好吧,黑客叔叔,你应该已经从你自己的最后一句话中猜到了regsvr32是如何为我们工作的。


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

RegSvr32.exe按照这个顺序调用以下Win32函数。

* OleInitialize
* LoadLibrary来加载DLL
* DllRegisterServer或DllUnregisterServer
* 自由图书馆
* OleUninitialize

http://msdn.microsoft.com/en-us/library/ms683152(VS.85).aspx
自由库功能

释放加载的动态链接库(DLL)模块,如果有必要,减少其引用计数。
当引用计数为零时,该模块将从调用的地址空间卸载。
进程,并且该句柄不再有效。

也就是说,regsvr32加载和释放库。但与terminal.exe不同的是,它自己或用我上面建议的简单而优雅的解决方案释放了库,但继续留在内存中,(这给了Windows一个暂时不加载库的理由,让任何其他进程来做)--与挂在内存中的metatrader不同,命令行工具regsvr32。exe命令行工具停止其进程并从内存中退出,这指示Windows从内存中完全卸载库。

一个库可以不使用regsvr32而被卸载,但这是轮盘赌。有些人喜欢轮盘赌,大多数专业人员不喜欢,这是一个发展水平的问题。

如果这个库是简单的,并且不依附于其他库,它可能会很快卸载。但是,如果库是复杂的、支持数据库的、有奇特控制的,它可能需要几分钟甚至几小时才能被卸下。

顺便说一下,关于AlwaysUnloadDLL参数--微软自己声称这只在2000年之前有效(现在应用更复杂的算法来计算 "对DLL的需求")。

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

卸载DLL

当DLL的使用次数为零时,Shell会自动卸载DLL,但只有在DLL在一段时间内没有被使用后才会卸载。这个不活动期有时可能长得让人无法接受,特别是在调试Shell扩展DLL的时候。对于Windows 2000之前的操作系统,你可以通过向注册表添加以下信息来缩短不活动期。

  • hkey_local_machine
  • 软件
  • 微软
  • 窗户
  • 当前版本
  • 探测器
  • AlwaysUnloadDll
 

由于我还在患重感冒(但请注意,即使在发烧躺在床上的时候,我也会免费帮助人们解决终端.exe问题,即专门解决他们的钱的问题),我可以告诉那些感兴趣的人(也包括不知情的职业学校学生),在大型远程公司做系统管理员是多么困难。

任何大公司都使用通用的工具。这意味着所有的服务器--本地和全球都运行Eorakl,在所有的工作站上使用同一程序的同一版本的链接Office、Excel--或者与Eorakl或MS SQL Server的分析程序,一些 "dbconnect.dll"。然后在一个 "美妙 "的日子里,系统管理员的开发人员终于调试出一个新版本的程序,所有本地的系统管理员(在公司的前一百名--系统管理员可以是500-800,1.250 Terabyte硬盘内存,130 NCR节点,145 Unix服务器系统和2600 Windows服务器,超过2000个公司地点的80000个邮件用户)来了一个命令,要求 "明天 "替换这一程序。这个程序很复杂,它使用了很多东西,仅仅在电脑上重写它是不行的。而且在regsvr32之后有必要重新启动计算机 - 如果系统管理员有时间的话

在这种更换只能从18-00到24-00进行,因为到18-00办公人员还在电脑上工作,24-00在服务器上开始Yorakla的服务工作,各站开始自动更新Windows和自动更新防病毒。有一些方法可以远程启动 regsvr32 和超载站而不去车站,但它们并不总是 有效,(启用了防火墙,没有logof-lenny用户,等等)。而计算机的本地系统管理员可能有50-100人,彼此相距甚远,而且在不同的楼层,在已经封闭的办公室。

所以系统管理员在公司大楼里跑来跑去,用手运行regsvr32。

 

Regsvr32被设计用来注册和取消注册COM服务器。

这些并不是所有的dlls。这是一种特殊的dll。没有必要调用Regsvr32。

如上所示调用FreeLibrary即可,或者不使用 "#import "而使用对。

LoadLibrary, FreeLibrary.

顺便说一下,我的dlls由于某种原因在删除指标后立即被释放。

 

实际上,就我个人而言,我是为那些能够阅读俄语和英语的人写的。奇怪的人,他们在这里第十次重复regsvr32的创建原因。 他们像咒语一样诵读它,像咒语一样,而其他人不知道为什么。如果regsvr32做了我们需要 做的事,而且没有副作用,那又有什么 关系呢?

这就像救护车或重症监护医生给酗酒者开了次硫酸钠的处方("高级 "的那种)。

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

他开始大喊大叫,说他不会喝,因为.....,他们想毒死他!

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

如果这里有这么多聪明人,那就让他们指出其他的标准工具吧,这些工具在任何电脑上都有,它可以加载并立即卸载你想要的任何LIBRARY,从而以这种方式重置Windows的DLLs缓存。

 
AlexEro >> :

...

他们第十次在这里重复了regsvr32的创建原因。如果regsvr32做了我们需要做的事,而且没有副作用,那又有什么关系呢?他们像咒语一样诵读它,像咒语一样。

这就像救护车或急诊室的医生给酗酒者开了次亚硫酸钠("高级 "的那种)。

...

这都是非常重要的。如果你在做医学类比,你在这里写的东西就像用斧头治疗一个生病的头。


AlexEro>>

...

卸载库可以不使用regsvr32,但这是轮盘赌。有些人喜欢轮盘赌,大多数专业人员不喜欢,这是一个发展水平的问题。

如果这个库是简单的,并且不依附于其他库,它可能会很快卸载。但是,如果库是复杂的,有数据库链接和奇异的控制,它可能需要几分钟甚至几小时才能被卸下。

...


你只是不明白加载/卸载dll机制在原则上是如何工作的,这就是为什么你在这个问题上有如此变态的幻想。你不应该使用regsvr32,它不是为它准备的。另外,你也不应该试图用FreeLibrary来卸载库,库应该被自己卸载,当然,如果其中没有严重的错误。你的 "简单而优雅的解决方案 "是无稽之谈。在很多情况下,特别是在DllMain内部发生死锁的情况下,它不会工作。


我再说一遍,卸载dll的唯一正常和正确的方法是在没有错误的情况下编写dll本身。如果dll不能正常卸载--那么编码者的手就歪了(即编码者,在终端本身一切都做得很正确)--仅此而已。我总是,重复一遍,总是在移除指示器后立即正常卸下Dll。这是正确的,这是它在终端的设计方式。


而你试图通过提及你作为系统管理员的经验来赋予你的小说以重量,这是徒劳的。我们已经发现你不是一个非常聪明的系统管理员,所以它看起来非常幼稚、可笑。

 
HideYourRichess >> :
你只是不明白dll加载/卸载机制在原则上是如何工作的,这就是为什么你在这个话题上有如此变态的幻想....。(你也不应该试图用FreeLibrary卸载一个库来脱机,这个库应该自己被卸载,当然如果里面没有严重的错误的话。你的 "简单而优雅的解决方案 "是无稽之谈。在很多情况下,特别是在DllMain内部发生死锁的情况下,它不会工作。
黑客叔叔,你的话中没有逻辑:如果库总是被卸载,为什么 "我的 "FreeLibrary调用按照你的说法 "在很多情况下都不能工作"?在deinit()块中多调用一个FreeLibrary会有什么危害?在你看来,调用FreeLibrary()会不会以某种方式阻止库的释放或其他什么?这一点不清楚,酷爱黑客的叔叔,这很明显。
 
AlexEro >> :
黑客叔叔,你说的这些都是没有逻辑的

第一个问题--系统如何知道从哪个进程卸载dll?

问题2--我如何在不加载dll的情况下找到入口点?


现在,基本上是这样。该dll在regsvr期间被加载和卸载,以便正确注册。当然,这对从其他进程中卸载它也没有影响。

不要试图让自己听起来比实际情况更愚蠢。不过,你可以读取法力。

如果库一直在卸载,为什么 "我的 "FreeLibrary调用,按照你的说法 "在很多情况下不能工作"?在deinit()块中多调用一个FreeLibrary会有什么危害?也许你的FreeLibrary()调用会以某种方式阻止库的释放,还是什么? 酷酷的黑客叔叔,而且是个明白人。

这很明显。除了卸载dll,指标(专家)的去初始化的实现可以是任何与之直接相关的东西,这就把未经授权的dll的释放变成了黑客,这又不能保证终端的正确操作。


>> 所以,祝你好运,继续努力。

2所有:不要考虑雇用他做管理员。