我有一个exe名为test.exe其通常用作独立的应用程序。我想使用此exe作为另一应用程序中的模块(DLL),APP.EXE。

在TEST.EXE的代码做很简单的东西,如:

void doTest()
{
    MyClass *inst = new MyClass();
    inst->someMethod();
}

其中someMethod()是虚拟和MyClass的具有虚拟D'TOR。结果 doTest()从test.exe的出口,从而创建点击一个名为test.lib LIB APP.EXE与此LIB链接到静态加载TEST.EXE在启动时。

当我运行test.exe的单机运行得很好,但,当我运行它从内APP.EXE崩溃加载。结果 走进与调试器的代码显示,飞机坠毁在调用虚方法。事实证明,在某种程度上vftable变坏。

一些调查,事实证明,当MyClass的的构造函数中的代码运行后,vftable是一回事,但如果调用new回报它与别的东西叫做“本地vftable”取代。我发现这是为什么这个名不见经传的讨论。

在大约一天的时间调试它发生,我认为在这个“本地vftable”的指针是在两种情况下是相同的,当test.exe的是独立自主,它则作为一个模块加载的。因为test.exe的被加载到不同的地址,这不可能是正确的......结果 为了验证这一理论我在连接选项的一个改变装载地址在test.exe的加载时它是在APP.EXE现在,你瞧,一切正常。

显然,这不是一个永久性的解决方案,因为下一次该随机选择的地址可以被占据,将再次发生相同的问题。

所以我的问题:为什么这种“本地vftable”捆绑exe文件的静态加载地址?加载一个exe作为模块坏事?为什么该exe假设它被加载到其静态地址?

就为背景:这是所有与2008年MSVC完成,Windows XP的64位

有帮助吗?

解决方案 2

我结束了使用被简单地添加一个编译配置并编译该exe作为一个真正的DLL,而不是迫使它像一个的解决方法。

使用/fixed:no没有解决由于某些原因的问题。

EXE和DLL之间的另一个区别I是该入口点是不同的。一个DLL的入口点的DllMain作为其中一个exe在最终调用的main()或WinMain函数()的CRT的入口点。

其他提示

VC ++剔除从默认.EXE文件RELOC信息,因为通常它们并不需要是可重定位。

您可以强制其保持与RELOC信息/固定:没有。请参阅: http://msdn.microsoft.com/en-us/library/ w368ysh2.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top