令我惊讶的是,我发现VB6代码使用Declare
语句来定义.dll中的函数,它们存在于程序文件夹中而不在Windows上注册。这似乎是一种超级简单的方法,可以避免使用.dll地狱而不必使用并排清单。我可以在某处阅读更多有关此内容的内容吗?有障碍吗?
答案 0 :(得分:2)
Windows在LoadLibrary的文件夹记录良好的文件夹中搜索(VB6在幕后使用它来解析Declare声明)。由于搜索文件夹列表中的第一个位置是应用程序自己的文件夹,因此您的发现非常有意义。
尽管如此,它并没有解决“DLL地狱”问题。例如,它不适用于系统DLL,因为Windows会预加载大部分DLL。此外,如果DLL已经加载到内存中,Windows可能会使用该DLL的副本(不共享数据,但可以重用代码)。
这是产生清单的部分原因;它们允许应用程序严格定义系统DLL的所需版本,以便提供某些功能。 VB6的技术是老式的(就像VB6一样)。
答案 1 :(得分:2)
Declare
语句用于“非及时”绑定到非ActiveX DLL。在程序“触摸”声明的入口点之前,不会尝试加载库。
它基本上与DLL Hell的主题毫无关系。
混乱的思维甚至可以导致人们在“EXE”旁边放置ActiveX DLL,它实际上可以导致 DLL Hell,因为倾向于这样做的人也使用糟糕的技术来安装和卸载应用程序。
故事的道德:
永远不要永远不要在安装时将DLL放在“VB6应用程序旁边”。如果您的私有DLL未与其他应用程序共享,那么将它们放入应用程序文件夹下的libs
等文件夹中。可能的异常可能是非COM DLL,例如您希望使用Declare
的那些。
对于清单也有很多误解,其中有多种。您可能正在考虑的是应用程序和程序集清单。
这些可用于在并排安装的库的不同版本中进行选择,或者它们可用于隔离与DLL Hell有关的部分的应用程序和程序集。
当然,应用程序清单可用于指定Windows应如何运行应用程序的其他一些事项。