代码之家  ›  专栏  ›  技术社区  ›  javid piprani

在Windows上安装共享DLL的位置

  •  6
  • javid piprani  · 技术社区  · 14 年前

    我有一个可以安装在Windows(XP/Vista/7)上的驱动程序。它通过一个第三方应用程序链接到的本地C++ + DLL访问,这也是一个Winsock提供程序(WSP)。它以前是在System32下安装的,但看到不这样做的建议后,我改为在ProgramFiles下安装。

    现在的问题是,当人们想在自己的应用程序中使用它时,他们要么将其复制回System32,要么将其复制到应用程序目录中,因为当应用程序试图加载DLL时,Windows不会在ProgramFiles下搜索install目录。

    我找不到任何讨论这个问题的Microsoft文档,所以如果不应该使用System32,那么应该在哪里安装共享DLL?

    5 回复  |  直到 14 年前
        1
  •  5
  •   Hans Olsson    14 年前

    因为它是一个链接到你的驱动程序的DLL,也许这不是一个问题,但我会小心尝试共享该DLL,而不是试图让所有客户端应用程序的开发人员在他们的应用程序文件夹中保留自己版本的DLL。 我在DLL地狱里玩得太开心了,不想再有任何奇怪的bug,因为AppX用一个破坏AppY的旧版本重写了DLL。

        2
  •  7
  •   Hans Passant    14 年前

    is here ,技术参考 is here

    除了微软,我还没见过其他人真的这么做。值得注意的是,MSFT放弃了VS2010的C/C++ CRT和MFC运行时DLL的WiSXS部署,这引起了太多的问题。他们回到了c:\windows\system32。不过,与之相当的管理层(GAC)正在走强。可能是更好的工具支持。

    我相当肯定,在很大程度上,每个人都选择应用程序本地部署。

        3
  •  2
  •   Martin Beckett    14 年前

    路上的任何地方都可以。
    如果这只用于你的应用程序集(如Qt4.dll),那么在“c:\program files\my company”的根目录下就可以了,或者在下面有一个“共享”文件夹。

    如果它被你不知道的其他应用程序使用(例如视频编解码器),那么system32是有意义的(当你安装时需要管理员权限)

        4
  •  2
  •   stakx - no longer contributing Saravana Kumar    14 年前

    一种可能是将它们安装在 Program Files ,正如@Martin Beckett所建议的。

    可变文件系统位置,注册表中的固定项

    如果不想在固定位置安装它们,也可以将它们的位置存储在Windows注册表中。你应该在下面安装一些钥匙 HKEY_LOCAL_MACHINE\SOFTWARE

    注意:防止孤立DLL

    您可以更进一步,使用注册表或其他存储(例如文件)来存储有关哪个应用程序使用哪个dll的信息。例如:

    FooCommon.dll <- FooApp1, FooApp2, FooApp3
    FooBar.dll    <- FooApp1, FooApp3
    FooBaz.dll    <- FooApp2, FooApp3
    

        5
  •  1
  •   Aaron Klotz    14 年前

    本机dll可以并排存储为程序集。看到了吗 this reference 更多信息。这与.NET全局程序集缓存是分开的,但它使用类似的概念。这个 blog post