【发布时间】:2012-03-01 02:31:56
【问题描述】:
类 SomeClass
{
//一些成员
MemberClass one_of_the_mem_;
}
我在 dll 中有一个函数 foo( SomeClass *object ),它是从 exe 调用的。
问题
one_of_the_mem_ 的地址在调度 dll 调用期间发生变化。
详情:
在调用之前(来自 exe):
'&(this).one_of_the_mem_' - `0x00e913d0`
之后 - 在 dll 本身中:
'&(this).one_of_the_mem_' - `0x00e913dc`
对象的地址保持不变。只有每次地址偏移c的成员。
我想要一些关于如何解决此问题的指示。
代码:
来自 Exe 的代码
stat = module->init ( 这个, object_a, &object_b, 对象_c, con_dir );
DLL 中的代码
Status_C ModuleClass( SomeClass *object, int index, Config *conf, const char* name)
{
_ASSERT(0); //DEBUGGING HOOK
...
更新 1:
我按照迈克尔的指示比较了成员的偏移量,它们在两种情况下都是相同的。
更新 2:
我找到了一种方法来转储类布局并注意到大小的差异,但我必须弄清楚为什么会发生这种情况。
linked 是我发现转储类布局的问题。
更新 3:
最终更新:解决了这个问题,非常感谢 Michael Burr。
事实证明,其中一个构建使用 32 位时间,_USE_32BIT_TIME_T 在其中定义,另一个使用 64 位时间。所以它为对象生成了不同的布局,附上差异文件。
【问题讨论】:
-
DLL 是否有可能是用不同版本的类编译的?
-
你能发布一段最小的、完整的代码来重现这个吗?
-
听起来你的 exe 和 dll 使用不同的编译器(对齐)标志。
-
@Kerrek SB 我不知道这是否足够,由于限制,我无法提供实际代码。对不起。
-
Nasgul,您不必发布您的实际代码,但您确实需要发布演示您描述的问题的代码。如果您不能发布您的真实代码,那么请编写一些表现出相同问题的新代码。首先显示
module->init和ModuleClass函数之间的关系。如果您的函数具有相同数量的参数,这将有所帮助。
标签: c++ windows visual-studio dll