C++ DLL函数从参数中获取错误值
我对dll函数调用有问题。 函数调用以一个结构作为参数,该结构在其他数据类型中包含一个double。 调用函数后,函数获取的结构中double的值与传递给函数之前的值完全不同,类似于-2.3443E4535 下面是调用的一个片段,dll函数现在只需在结构中打印double的值(第二个参数) 这是结构和函数C++ DLL函数从参数中获取错误值,c++,dll,C++,Dll,我对dll函数调用有问题。 函数调用以一个结构作为参数,该结构在其他数据类型中包含一个double。 调用函数后,函数获取的结构中double的值与传递给函数之前的值完全不同,类似于-2.3443E4535 下面是调用的一个片段,dll函数现在只需在结构中打印double的值(第二个参数) 这是结构和函数 #pragma pack(1) struct MyStruct { int orderNum; int
#pragma pack(1)
struct MyStruct
{
int orderNum;
int id;
char symbol[12];
int cmd;
char comment[32];
int internal_id;
int activation;
int count;
double rate;
time_t timestamp;
int reserved[4];
double price;
Mystruct(_orderNum,_rate,_timestamp,_activation,_cmd,_id,_price):orderNum(_orderNum),rate(_rate),timestamp(_timestamp),activation(_activation),cmd(_cmd),id(_id),price(_price){}
};
#pragma (pop)
void APIENTRY MyFunc(MyStruct *myStruct)
{
std::cout << myStruct->rate;
};
#pragma包(1)
结构MyStruct
{
int orderNum;
int-id;
字符符号[12];
int-cmd;
char注释[32];
内部标识;
int激活;
整数计数;
双倍费率;
时间戳;
int保留[4];
双倍价格;
Mystruct(_orderNum,_rate,_timestamp,_activation,_cmd,_id,_price):orderNum(_orderNum),rate(_rate),timestamp(_timestamp),activation(_activation),cmd(_cmd),id(_id),price(_price){}
};
#布拉格语(流行语)
void apitery MyFunc(MyStruct*MyStruct)
{
性病:死亡率;
};
我忘了包括那些布拉格马的。代码来自一个受限的API,这就是为什么我不能发布实际的代码,但这完全是相同的结构
谢谢对于您报告的内容,唯一合理的解释是DLL具有不同的结构定义。因此,当调用代码写入结构的成员时,它写入的偏移量与DLL中使用的偏移量不同 在上面的语句中,我的意思还包括结构布局在DLL中与调用代码中不同的可能性。碰巧,对于32位目标,结构的压缩和对齐布局是相同的。对于64位目标,压缩和对齐不同
很难说您发布的代码中的不匹配是什么。不幸的是,你似乎有点害羞。如果您只能为DLL和使用DLL的代码发布整个代码,那么很容易告诉您不匹配的原因。因此,就目前情况而言,除非您能够发布完整的代码,否则恐怕您必须解决其余细节。对于您报告的内容,唯一合理的解释是DLL具有不同的结构定义。因此,当调用代码写入结构的成员时,它写入的偏移量与DLL中使用的偏移量不同 在上面的语句中,我的意思还包括结构布局在DLL中与调用代码中不同的可能性。碰巧,对于32位目标,结构的压缩和对齐布局是相同的。对于64位目标,压缩和对齐不同
很难说您发布的代码中的不匹配是什么。不幸的是,你似乎有点害羞。如果您只能为DLL和使用DLL的代码发布整个代码,那么很容易告诉您不匹配的原因。因此,就目前情况而言,除非您能够发布完整的代码,否则恐怕您必须解决其余细节。我们可以看看您的结构实现和dll使用的结构实现吗。这可能是一种数据填充混乱。你能告诉我们Mystruct的定义和MyFunc的代码吗。任何人都无法帮助你调试他们看不见的代码。这就是函数目前所做的全部工作。你能提供ADD和TRD_ADD吗?可能是调用约定不匹配。如果主例程的编译与dll的编译之间的
MyStruct
定义不同,则可能会出现此问题。我们可以看看您的结构实现和dll使用的结构实现吗。这可能是一种数据填充混乱。你能告诉我们Mystruct的定义和MyFunc的代码吗。任何人都无法帮助你调试他们看不见的代码。这就是函数目前所做的全部工作。你能提供ADD和TRD_ADD吗?可能是调用约定不匹配。如果主例程的编译与dll的编译之间的MyStruct
定义不同,则可能会出现此问题。还有一些需要注意的问题。结构的定义可能匹配,但填充可能不匹配。@RemyLebeau对我来说,对齐应该被视为结构定义的一部分。对于32位目标,此结构的打包和对齐布局是相同的。DLL是使用预处理器指令_USE_32BIT_TIME_T构建的,而console应用程序不是,默认为64位,这使得结构未对齐。将该指令添加到控制台应用程序可以解决该问题。我真的很感激David@Kraz谢谢你的接受,我很高兴你找到了这个谜题的底部。还有一些需要注意的。结构的定义可能匹配,但填充可能不匹配。@RemyLebeau对我来说,对齐应该被视为结构定义的一部分。对于32位目标,此结构的打包和对齐布局是相同的。DLL是使用预处理器指令_USE_32BIT_TIME_T构建的,而console应用程序不是,默认为64位,这使得结构未对齐。将该指令添加到控制台应用程序可以解决该问题。我真的很感激David@Kraz谢谢你的接受,我很高兴你找到了这个谜题的答案。
#pragma pack(1)
struct MyStruct
{
int orderNum;
int id;
char symbol[12];
int cmd;
char comment[32];
int internal_id;
int activation;
int count;
double rate;
time_t timestamp;
int reserved[4];
double price;
Mystruct(_orderNum,_rate,_timestamp,_activation,_cmd,_id,_price):orderNum(_orderNum),rate(_rate),timestamp(_timestamp),activation(_activation),cmd(_cmd),id(_id),price(_price){}
};
#pragma (pop)
void APIENTRY MyFunc(MyStruct *myStruct)
{
std::cout << myStruct->rate;
};