我遇到了dll函数调用的问题。 函数调用将struct作为参数,struct包含其他数据类型中的double。 在调用函数之后,函数获取的struct中double的值与传递给函数之前的值完全不同,类似于-2.343443e4535。
这里是一个调用片段,现在所有的dll函数都只是在struct(第二个参数)中打印double的值。
TRD_ADD myFunc= (ADD) GetProcAddress(hinstLib,"MyFunc");
Mystruct * trd = new Mystruct(1,11.1,0,0,0,0,134000);
(myFunc) (trd);
这是结构和功能
#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's。代码来自受限制的API,这就是我无法发布实际代码但结构完全相同的原因。
由于
答案 0 :(得分:4)
您报告的唯一可信的解释是DLL具有不同的结构定义。因此,当调用代码写入结构的成员时,它会写入与DLL中使用的偏移量不同的偏移量。
在上面的语句中,我的意思是还要涵盖结构的布局在DLL中与调用代码中的布局不同的可能性。实际上,对于32位目标,结构的打包和对齐布局是相同的。对于64位目标,打包和对齐不同。
很难说你发布的代码不匹配的是什么。不幸的是,你似乎有点害羞。如果你只能发布整个代码,对于DLL和使用DLL的代码,很容易告诉你不匹配是什么。因此,除非您能够设法发布完整的代码,否则我担心您将不得不计算其余的细节。