依赖于其他DLL的插件DLL

我正在编写一个DLL来插入另一个(第三方)应用程序。 该DLL将需要依赖另一组DLL(由于许可证原因,我不能静态链接)。

我想我的DLL是“xcopy-deployable”到任何目录。 我也不想要求将这个目录添加到path中。

如果我用通常的方法构buildDLL,Windows将拒绝加载DLL,因为它无法在当前进程旁边findDLL。

有没有什么好的select来帮助WindowsfindDLL?


回答一些问题:

  • 该DLL是用C ++编写的。
  • 额外的DLL是QT-dll。
  • 我想将额外的DLL放在与我的插件DLL相同的文件夹中。 我可以从GetModuleFileName获取该文件夹的名称。
  • 该应用程序是Firefox,该DLL是一个PKCS#11安全模块。
  • 应用程序使用DL​​L的完整path加载DLL(用户在安装插件时提供它)。
  • 要求将DLL放在System32中或应用程序旁边就可以工作,但这有点麻烦,可能会导致卸载程序出现问题。
  • LoadLibraryGetProcAddress当然会起作用,但在我的情况下并不可行。 我在其他DLL中使用了数百个(如果不是数千个)方法。 我真的需要使用导入库。

我曾想过在DllMain中使用延迟加载的dll和SetDllDirectory 。 有没有人尝试过这样的事情?

我能想到3种方法。

  1. 把DLL放在你的应用程序相同的文件夹(你不能这样做?)
  2. 使用运行时链接。 LoadLibrary()GetProcAddress()
  3. 使用清单http://msdn.microsoft.com/en-us/library/aa374182(VS.85).aspx

但是,如果该DLL不在.exe文件夹中,你怎么知道它在哪里? 忘记Windows不知道,你怎么知道?

你可以指定dll的路径作为LoadLibrary()的参数。

另一个选择是修改PATH变量。 有一个启动主应用程序的批处理文件,并设置PATH =%PATH%;%〜dp0。 这确保了最小的占地面积,运行后系统中没有剩余的痕迹。