2

我有一个 dll 函数调用的问题。函数调用将结构作为参数,并且结构包含其他数据类型中的双精度。调用函数后,函数获取的结构中的双精度值与传递给函数之前的值完全不同,类似于 -2.343443e4535。

这是调用的一个片段,现在 dll 函数所做的只是打印结构中的双精度值(第二个参数)。

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,这就是为什么我不能发布实际代码但结构完全相同的原因。

谢谢

4

1 回答 1

4

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

在上面的陈述中,我的意思也是要涵盖 DLL 中的结构布局与调用代码中的布局不同的可能性。碰巧的是,对于 32 位目标,结构的打包和对齐布局是相同的。对于 64 位目标,打包和对齐是不同的。.

从您发布的代码中很难说不匹配是什么。不幸的是,你似乎有点害羞。如果您只能发布整个代码,对于 DLL 和使用 DLL 的代码,很容易告诉您不匹配是什么。所以,就目前而言,恐怕你必须解决剩下的细节,除非你能设法发布完整的代码。

于 2013-05-03T21:49:44.497 回答