如何卸载dll - 页 2

 
OneDepo >> :

WinAPI中没有UnloadLibrary(),有FreeLibrary()。

你是对的 :-)。我的MSDN由于某种原因没有加载:-)。

.

OneDepo>>:

操作系统只在加载计数器值为零时卸载任何dll。

在这种情况下,加载dllku的唯一应用程序是metatrader。

 
jartmailru >> :

在这种情况下,加载dllku的唯一应用程序是Metatrader。

这不是重点,我不关心是否有十个申请。我们的想法是玩弄计数器,如果你真的非常想卸载dll,你应该尝试将计数器重置为零。 为专题发起人提出的想法;)
 
njel >> :

通过#import使用一个外部库。


当我卸载idnikator时,终端仍然保留着dll。我如何摆脱它?

编写一个没有错误的dll。通常情况下,dlls会自己卸载,除非有任何意外情况。


除了任何 "黑客 "方法之外,这是唯一可能的事情。

 
Windows会对任何DLL进行缓存。它缓存了很多。
 
HideYourRichess >> :

在没有错误的情况下写入dll。通常情况下,除非有任何意外情况,否则dll会自行卸载。

好吧,我亲爱的伙计。

我已经得到了最新的Dll,并认真地决定证明你是错的:-)。

我发现,在退出脚本后,以及退出指标后

(通过关闭窗口或删除指标),Dll被卸载...

至于 "识字"...DllMain总是愚蠢地返回TRUE。

但我记得大约一年前,我不得不退出Metatrader来替换Dll。

操作系统 = WinXP SP3, MT = 225

 

你们这些人很奇怪还是什么。我只遇到过几次这样的问题,这些问题没有被卸载,而且总是由于代码中的错误。这是第一个。第二个。让我提醒你,微软发明了这种隐式加载/卸载的机制,专门用来简化Dll的处理。


你从哪里得到这些奇怪的问题 - 我拒绝理解。


是的,而且,我个人不直接使用DllMain,。

 
HideYourRichess >> :

你们这些人很奇怪还是什么。我只遇到过几次这样的问题,有东西没有卸下来,而且总是由于代码中的错误。


你从哪里得到这些奇怪的问题 - 我拒绝理解。


而且我个人并不直接使用DllMain。

下面是MSDN的一段话。
"当系统以DLL_PROCESS_ATTACH以外的任何值调用DllMain函数时,返回值被忽略。"

也就是说,当你卸载一个Dll-in时,系统绝对不关心你作为一个程序员在那里的想法。

它不可能写得正确或不正确--如果你不在其中,它就会流出来。如果可能的话。

.

我没有看到你写了什么实质性的东西--从项目中删除动态链接。

对运行时包的依赖性,仔细处理链接的Dlls--当然,不太可能在那里使用。

当然,在那里使用,并可能与COM子系统一起工作,在那里,像OleInitialize这样的单一调用可以拾取

几十个系统Dlls。由于所有这些依赖都是一次性加载的...创业很容易。

但在去初始化的情况下--例如,如果Dll和Metatrader都挂上了相同的系统库----。

可能有问题 - 谁知道操作系统后面有什么...

.

我们是API用户,通过.h/.lib和加载库来钩住所有Dll功能。

最有可能发生在应用程序初始化时,我们什么也做不了。

或者我们会自己加载所有的库,并通过手工动态链接所有的函数。

另一方面,在赤裸裸的数学上应该一切正常--或在一些API函数上。


AlexEro>>
Windows缓存了任何DLL。它是非常强大的缓存。

由于上述原因,事实证明,这与现实相当接近。也就是说,如果dll-ine钩住了依赖关系-----。

那么,如果不加载加载这个DLL的应用程序,操作系统就无法卸载它。

 
jartmailru >> :

下面是MSDN的一段话。
"当系统以DLL_PROCESS_ATTACH以外的任何值调用DllMain函数时,返回值被忽略。"

也就是说,当你卸载一个Dll-in时,系统对你作为一个程序员在那里的想法绝对没有区别。

它不可能写得对或错--如果你不在其中,它就会被淘汰。如果可能的话。


再次,对于特别有天赋的人来说--如果dll的编写没有错误--一切都应该照常工作。对于通过晚期链接加载的库,没有特殊的卸载机制。清楚了吗?MQL4不提供任何与通过Load/FreeLibrary明确加载/卸载Dll有关的服务。同样地,也没有对终止的访问。

jartmailru>>

我没有看到你写了什么实质性的东西--从项目中删除动态链接。

对运行时包的依赖性,仔细处理链接的Dlls--当然,不太可能在那里使用。

当然,在那里使用,并可能与COM子系统一起工作,在那里,像OleInitialize这样的单一调用可以拾取

几十个系统Dlls。由于所有这些依赖都是一次性加载的...创业很容易。

但在去初始化的情况下--例如,如果Dll和Metatrader都挂上了相同的系统库----。

可能有问题--谁知道操作系统的后面有什么。


阅读《里希特》,我强烈推荐它。很明显,在与dlls的工作中没有任何魔力,一旦当前进程的地址空间不再需要库,库总是被卸载。这种需求是由计数器决定的。如果计数器在卸载MQL-程序的时候没有归零,就意味着在某处出现了错误,而且是粗略的错误。

jartmailru>>

因此,事实上我们是API用户在钩住所有的Dll功能--通常是通过.h/.lib和加载库。

最有可能发生在应用程序初始化时,我们什么也做不了。

或者我们会自己加载所有的库,并通过手工动态链接所有的函数。

另一方面,在赤裸裸的数学上应该一切正常--或在一些API函数上。


由于上述原因,事实证明,这与现实相当接近。也就是说,如果dll-ine钩住了依赖性--

那么操作系统就不能再卸载它而不去卸载加载这个Dll的应用程序。

MT4的开发者不把Load\FreeLibrary机制放在用户手中是非常正确的。非常正确。这都是关于交易者的编程文化水平。


最后,请阅读微软自己的建议--那里白纸黑字地写着,虽然有可能使复杂的dll之间相互依赖--但这一切都有其局限性。

 
AlexEro >> :
Windows会对任何DLL进行缓存。它缓存了很多。

我不会把将dll映射到进程地址空间的机制称为缓存机制。这是一个完全独立的过程。

 
HideYourRichess >> :

我不会把对进程地址空间的dll映射机制称为缓存机制。这是一个完全独立的过程。

你是个古怪的人。在Windows\system32目录下甚至有一个dllcache目录,世界上所有的系统管理员都在用regsvr32卸载所有的dlls,而你却在这里对人们讲寓言。你在指望谁?这里没有白痴。