我一直在试图弄清楚安装程序如何工作以及如何将所有内容捆绑到一个可执行文件中以及如何创建自己的文件。我尝试使用名为HxD的十六进制编辑器,它允许您将文件的当前十六进制转储导出到.c
源文件中,该文件包含一个类似于下面的十六进制转储的数组。
兴奋,我尝试使用一些简单的C ++代码编写文件:
ofstream newbin("test.exe", ios::binary);
newbin << hex << rawData;
newbin.close();
...然后尝试运行它。
经过一些进一步的研究后发现,我的小程序只编写了PE文件在Windows中使用的MZ.
标题,并排除了其余的代码。创建的可执行文件具有4D 5A 90
或ASCII MZ.
的十六进制转储。这是我的编码错吗?为什么不写十六进制数据?我需要使用一些较低级别的书写工具或装配吗?如果是这样,是否有允许我在这样的级别编写的C / C ++库?谢谢!
答案 0 :(得分:4)
rawData
是char*
,由流操作符解释为字符串,由它遇到的第一个0x00
字节终止。
对于二进制书写,最好使用
ostream& write(const char*, int);
方法,导致
newbin.write(rawData, 65536);
假设65536是缓冲区的实际使用大小。
希望这会有所帮助:)
答案 1 :(得分:1)
存储二进制数据的更好方法是使用资源。菜单,图标,位图存储在资源中。
您可以创建自定义资源并使用FindResource
函数LoadResource
,然后使用LockResource
将其映射到内存中。
然后你可以用数据做任何你想做的事,当然把它写到文件中。
安装程序通常使用类似的东西,而不是在源代码中嵌入大量二进制数据。这种方法还有其他优点:
此外,您最好使用专门的工具来创建安装程序。