在EXE中分发DLL(C ++)

时间:2010-10-22 15:33:34

标签: c++ dll

如何在EXE文件中包含我的程序依赖DLL(所以我只需要分发那个文件)?我正在使用C ++,所以我不能像通常用C#那样使用ILMerge,但有没有更简单的方法在Visual Studio中自动执行此操作?

我知道这是可能的(这就是安装程序工作的原因),我只是需要帮助指出最好的方法。

感谢您的时间。

3 个答案:

答案 0 :(得分:3)

这种方法存在许多问题。例如,请参阅REAL Software的this post。他们的“REALbasic”产品曾经做过这样的事情并且遇到了问题,包括:

  • 在运行时编写DLL时,会触发反病毒警告。
  • 用户没有写入权限或磁盘空间不足的计算机出现问题。

他们试图解决问题导致更多问题,包括崩溃。最终他们心软了,现在与应用程序并排分发DLL。

如果确实需要单EXE部署,并且由于某种原因无法使用安装程序,那么可靠的方法是静态链接所有依赖项。这假设您具有正确的.lib s(而不仅仅是.lib在DLL中的链接。)

答案 1 :(得分:1)

大多数安装程序使用zip文件(或类似的东西)来保存所需的任何文件。当您运行安装程序时,它会解压缩数据并将各个文件放在需要的位置(通常会添加注册表项,注册它安装的任何COM控件等)。

答案 2 :(得分:1)

有两种选择,两种选择都不太理想:

  1. 在某处写一个临时文件
  2. “手动”将DLL加载到内存中,即创建内存块,将DLL映像放入内存,然后处理重定位和外部引用。
  3. Nate在上面描述了第一种方法的缺点。第二种方法是可能的,但是很复杂(需要深入了解某些低级别的东西)并且不允许DLL代码访问DLL资源(这很明显 - 没有DLL的图像所以操作系统不知道在哪里拿资源)。

    在某些情况下可以使用的另一个选项:创建一个虚拟磁盘,其内容存储在EXE文件资源中,然后从那里加载DLL。这可以使用我们的SolFS产品(操作系统版),但创建虚拟磁盘本身需要使用内核模式驱动程序,必须在使用前将其写入磁盘。