Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DLL函数从参数中获取错误值_C++_Dll - Fatal编程技术网

C++ DLL函数从参数中获取错误值

C++ DLL函数从参数中获取错误值,c++,dll,C++,Dll,我对dll函数调用有问题。 函数调用以一个结构作为参数,该结构在其他数据类型中包含一个double。 调用函数后,函数获取的结构中double的值与传递给函数之前的值完全不同,类似于-2.3443E4535 下面是调用的一个片段,dll函数现在只需在结构中打印double的值(第二个参数) 这是结构和函数 #pragma pack(1) struct MyStruct { int orderNum; int

我对dll函数调用有问题。 函数调用以一个结构作为参数,该结构在其他数据类型中包含一个double。 调用函数后,函数获取的结构中double的值与传递给函数之前的值完全不同,类似于-2.3443E4535

下面是调用的一个片段,dll函数现在只需在结构中打印double的值(第二个参数)

这是结构和函数

#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;
};