有没有办法在编译期间将现有的.exe文件与其他C ++源文件链接起来?我实际上要做的是使用LZMA(7zip)SDK压缩和解压缩我的控制台程序中的一些文件,但不幸的是,它很难用于新手。
有一个名为7za.exe的LZMA命令行版本,我想知道我是否能以某种方式将其嵌入到我的程序中并像函数一样使用它。它可以很容易地与system()函数一起使用(这似乎是一个非常危险的东西)然后如果我将我的程序发送给没有7za.exe的人在正确的文件夹中它将无法正常工作。
我遇到了windows.h头文件中的CreateProcess()函数,但它似乎以更合适和更高级的方式实现了system()的功能。我不知道它是否可以在编译期间链接 exe文件,如目标文件
答案 0 :(得分:3)
CreateProcess()
是一个Windows API调用,用于启动一个进程,就像它听起来一样,作为程序的一个孩子,你可以通过知道HANDLE
来控制它。 system()
执行系统命令。这就是你所知道的,我个人不惜一切代价避免使用它 - 尤其是因为它不可移植(该功能存在于Windows和Linux上,但命令不会)。
可以将数据附加到EXE映像的末尾 - 这就是安装程序的工作方式。看看这个microsoft support article,它奇怪地为您提供基本的代码,但您应该能够将其简化为C ++。这是一篇关于creating a self-extractor的文章,可能更合适。两者都应该允许你在exe中嵌入文件。
我不建议您解压缩7za
并从System()
或CreateProcess()
调用它 - 我建议您学习SDK。这很困难,但你会从中学到很多东西。
最后,由于您必须修改现有的exe文件,因此无法在编译时执行此操作。您需要让代码为其自己的图像或其他图像添加任何内容。
关于附加到exe的addressing data的更多细节。
答案 1 :(得分:1)
好的,试试这个......
这是连接步骤。现在,对exe的运行时访问是另一回事。基本上,算法是这样的:
如果您以这种方式分发其他人的工作,请获得正确的许可。将别人的二进制文件扔进自己的版本通常是侵犯版权 - 当然也有例外。