Vb6 &引用;宣布;语句是否是绕过.dll地狱的另一种方法?

Vb6 &引用;宣布;语句是否是绕过.dll地狱的另一种方法?,vb6,dll,Vb6,Dll,令我惊讶的是,我发现了VB6代码,它使用Declare语句来定义.dll中的函数,该函数位于程序文件夹中,而没有在Windows上注册。这似乎是一种避免.dll地狱的超级简单方法,而不必求助于使用并行清单。我能在什么地方多读一些关于这方面的资料吗?是否存在障碍?Windows在一系列有文档记录的文件夹中进行搜索(VB6在后台使用这些文件夹来解决声明问题)。由于搜索文件夹列表上的第一个位置是应用程序自己的文件夹,因此您的发现非常有意义 不过,它在很大程度上并不能解决“DLL地狱”问题。例如,它不能

令我惊讶的是,我发现了VB6代码,它使用
Declare
语句来定义.dll中的函数,该函数位于程序文件夹中,而没有在Windows上注册。这似乎是一种避免.dll地狱的超级简单方法,而不必求助于使用并行清单。我能在什么地方多读一些关于这方面的资料吗?是否存在障碍?

Windows在一系列有文档记录的文件夹中进行搜索(VB6在后台使用这些文件夹来解决声明问题)。由于搜索文件夹列表上的第一个位置是应用程序自己的文件夹,因此您的发现非常有意义

不过,它在很大程度上并不能解决“DLL地狱”问题。例如,它不能用于系统DLL,因为Windows预加载了大部分DLL。此外,如果某个DLL已加载到内存中,Windows可能会使用该DLL的副本(不共享数据,但代码可以重用)


这是创建清单的部分原因;它们允许应用程序严格定义所需的系统DLL版本,以提供某些功能。VB6的技术是老式的(就像VB6一样)。

Windows在一系列有文档记录的文件夹中进行搜索(VB6在后台使用这些文件夹来解析声明)。由于搜索文件夹列表上的第一个位置是应用程序自己的文件夹,因此您的发现非常有意义

不过,它在很大程度上并不能解决“DLL地狱”问题。例如,它不能用于系统DLL,因为Windows预加载了大部分DLL。此外,如果某个DLL已加载到内存中,Windows可能会使用该DLL的副本(不共享数据,但代码可以重用)


这是创建清单的部分原因;它们允许应用程序严格定义所需的系统DLL版本,以提供某些功能。VB6的技术是老式的(就像VB6一样)。

声明语句用于“及时”绑定到非ActiveX DLL。在程序“接触”已声明的入口点之前,不会尝试加载库

它基本上与DLL地狱的主题无关

糊涂的想法甚至会导致人们将ActiveX DLL“放在”EXE旁边,这实际上会导致DLL地狱,因为这样做的人在安装和卸载应用程序时也会使用糟糕的技术

  • 设计糟糕的应用程序部署会在EXE旁边弹出一个共享的DLL或OCX
  • 如果运行设计糟糕的应用程序,VB6运行时无法在注册表中找到类,使用Windows启发式进行DLL搜索,立即找到EXE旁边的DLL并调用其自注册入口点
  • 后来安装了使用相同DLL/OCX且设计合理的无辜应用程序B、C、D,安装程序发现库已经注册
  • 设计糟糕的应用程序A会被卸载,通常只需删除程序文件中的文件夹即可
  • 应用程序B、C和D(以及将来使用该库的任何应用程序)现在都已损坏,这是由于指向不存在库的孤立组件注册造成的
  • 故事的寓意:

    永远,永远,永远不要在安装VB6应用程序时将DLL放在“旁边”。如果您有未与其他应用程序共享的专用DLL,请将它们放入应用程序文件夹下的
    libs
    等文件夹中。可能的例外情况可能是非COM DLL,例如您希望与一起使用
    Declare

    关于舱单也有很多误解,其中有多种。您可能正在考虑的是应用程序和程序集清单

    它们可以用于在并排安装的库的不同版本之间进行选择,也可以用于隔离应用程序和程序集,而这些应用程序和程序集是与DLL shell相关的部分


    当然,可以使用应用程序清单来指定Windows应如何运行应用程序的许多其他事项。

    使用
    Declare
    语句对非ActiveX DLL进行“即时”绑定。在程序“接触”已声明的入口点之前,不会尝试加载库

    它基本上与DLL地狱的主题无关

    糊涂的想法甚至会导致人们将ActiveX DLL“放在”EXE旁边,这实际上会导致DLL地狱,因为这样做的人在安装和卸载应用程序时也会使用糟糕的技术

  • 设计糟糕的应用程序部署会在EXE旁边弹出一个共享的DLL或OCX
  • 如果运行设计糟糕的应用程序,VB6运行时无法在注册表中找到类,使用Windows启发式进行DLL搜索,立即找到EXE旁边的DLL并调用其自注册入口点
  • 后来安装了使用相同DLL/OCX且设计合理的无辜应用程序B、C、D,安装程序发现库已经注册
  • 设计糟糕的应用程序A会被卸载,通常只需删除程序文件中的文件夹即可
  • 应用程序B、C和D(以及将来使用该库的任何应用程序)现在都已损坏,这是由于指向不存在库的孤立组件注册造成的
  • 故事的寓意:

    永远,永远,永远不要在安装VB6应用程序时将DLL放在“旁边”。如果您有未与其他应用程序共享的专用DLL,请将它们放入应用程序文件夹下的
    libs
    等文件夹中。可能的例外情况可能是非COM DLL,例如您希望与一起使用
    Declare

    关于舱单也有很多误解,其中有多种。您可能正在考虑的是应用程序和程序集清单

    这些