2011-09-27 53 views
8

有没有人注意到,如果你导入一个exe文件作为资源,它得到重定位,似乎它的PE头被重建?C++ visual studio 2010 exe中的资源获取Rebased?

有时候,这是令人讨厌的。有谁知道如何禁用rebasing!?

重现步骤在C++:

1)编译的hello world并手动设置其基地址(在属性),以让说0x1000000

2)使第二个项目并包括世界你好成资源。同样手动设置其基地址如上。

3)建立第二个项目

4)提取资源的exe和与PE编辑器检查它!它被设置回0x400000。为什么?!

+0

您的配置根据http://msdn.microsoft.com/en-us/library/hh7adf4f.aspx,你可能有问题:请加链接器参数。无论如何,我认为有很多可以重塑PE的程序,所以也许可以考虑尝试一下...... –

+0

editbin.exe据我了解,是一个外部程序,可以在编译后运行。重建PE头不会对上述情况产生任何影响。你错过了这一点。 – Ray

+4

资源编译器和资源API都不知道有关EXE文件的任何信息。他们把它们当作一个字节块来对待。因此,他们无法做任何事情来改变基地址。问题在于别处。 –

回答

1

您如何将EXE作为资源加入到第二个项目中?

使用这些定义:

#define BINFILE 222 
#define IDR_MYFILE 101 

如果我引用的可执行文件在我的.rc文件作为指向原来的文件,如:

IDR_MYFILE BINFILE "S:\\mysource\\t1\\Release\\t1.exe" 

然后,在提取后,我的嵌入式EXE资源没有重新设计,但保留了我的设计。

+0

是的。多数民众赞成我如何参考exe文件。我正在为此烦恼。正如Hans Passant所建议的,我会寻找其他原因。 – Ray

+0

也许你是如何从编译后的EXE中提取它的?我用PE资源管理器从EXE 2中提取EXE 1。它只是工作。 – Joe

+0

我使用visual studio本身来导出二进制文件。右键单击该文件并选择导出。应该是一样的。我想我缩小了这个问题。我曾经有一个混淆器。也许有些东西因为这个项目太旧而落后了。 – Ray

相关问题