DLL函数从参数中获取错误的值

时间:2013-05-03 17:43:13

标签: c++ dll

我遇到了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,这就是我无法发布实际代码但结构完全相同的原因。

由于

1 个答案:

答案 0 :(得分:4)

您报告的唯一可信的解释是DLL具有不同的结构定义。因此,当调用代码写入结构的成员时,它会写入与DLL中使用的偏移量不同的偏移量。

在上面的语句中,我的意思是还要涵盖结构的布局在DLL中与调用代码中的布局不同的可能性。实际上,对于32位目标,结构的打包和对齐布局是相同的。对于64位目标,打包和对齐不同。

很难说你发布的代码不匹配的是什么。不幸的是,你似乎有点害羞。如果你只能发布整个代码,对于DLL和使用DLL的代码,很容易告诉你不匹配是什么。因此,除非您能够设法发布完整的代码,否则我担心您将不得不计算其余的细节。