2010-10-22 53 views
2

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

我知道这是可能的(这就是为什么安装工作),我只是需要一些帮助被指向到这一目标的最佳途径。

谢谢你的时间。

+0

可以Visual Studio做静态链接,而不是动态链接? – Bruno 2010-10-22 15:44:00

+0

如果您正在寻找安装解决方案,我推荐NSIS(http://nsis.sourceforge.net/Main_Page)。安装程序以这种方式工作,因为DLL和其他程序文件位于EXE的数据部分。他们不加载这些DLL。如果您正在寻找一个将所有内容都汇总为一个的EXE,那么您需要静态编译它。 – Brad 2010-10-22 15:44:08

回答

1

存在着两种选择,这两者的理想是远:

  1. 写某处的临时文件
  2. 加载DLL内存“手动”,即创建一个内存块,把DLL图像到内存,然后处理重定位和外部引用。

第一种方法的缺点是通过内特如上所述。第二种方法是可能的,但是很复杂(需要深入了解某些低级别的东西),并且不允许DLL代码访问DLL资源(这很明显 - 没有DLL的映像,所以操作系统不知道在哪里采取资源)。在某些情况下可用

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

1

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

3

存在诸多问题这种方法。例如,请参阅REAL Software的this post。他们的“REALbasic”产品曾经这样做,并且存在以下问题:

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

他们试图解决这个问题造成了更多的问题,包括崩溃。最终他们放弃了并现在与应用程序并排分发DLL。

如果你真的需要单EXE部署,并且不能使用安装程序因某种原因,可靠的方式是静态链接的所有依赖。这假定你有正确的.lib(而不仅仅是链接在DLL中的.lib)。