2013-05-03 6 views
2

У меня проблема с вызовом функции dll. Вызов функции принимает параметр struct как параметр, и структура содержит двойной среди других типов данных. После вызова функции значение double в структуре, которую получает функция, полностью отличается от того, что было до перехода к функции, что-то вроде -2.343443e4535.DLL-функция получает неправильное значение из параметра

вот фрагмент вызова, все функции dll на данный момент просто распечатывают значение 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-ые годы. Код из ограниченного API, поэтому я не могу опубликовать фактический код, но это точно такая же структура.

Благодаря

+0

Можем ли мы увидеть вашу реализацию структуры и тот, который использует dll. Это может быть расстройство заполнения данных. – Jiwan

+2

Можете ли вы показать нам определение Mystruct и код для MyFunc. Никто не может помочь вам отлаживать код, который они не видят. – shf301

+0

Thats все функции на данный момент. – Krazibit312

ответ

4

Единственное правдоподобное объяснение того, что вы сообщаете, что DLL имеет другое определение структуры. Поэтому, когда вызывающий код записывает члены структуры, он записывает разные смещения из смещений, используемых в DLL.

В вышеприведенном утверждении я также подразумеваю, что макет структуры отличается от DLL от схемы в вызывающем коде. Как это бывает, для 32-битных целей упакованные и выровненные макеты вашей структуры одинаковы. Для 64-битных целей упакованы и выровнены разные. ,

Трудно сказать, что такое несоответствие из кода, который вы опубликовали. К сожалению, вы, кажется, немного застенчивы. Если бы вы могли публиковать весь код, как для DLL, так и для кода, который потребляет DLL, было бы легко рассказать вам, что такое несоответствие. Итак, поскольку это так, я боюсь, вам придется разобраться с остальными деталями, если только вы не сможете опубликовать полный код.

+0

Что-то еще нужно следить. Определение структуры может совпадать, но отступы могут не совпадать. –

+0

@RemyLebeau Для меня выравнивание должно рассматриваться как часть определения структуры. Для 32-битной цели, упакованные и выровненные макеты одинаковы для этой структуры, как это происходит. –

+0

DLL была построена с директивой Preproccessor от _USE_32BIT_TIME_T, в то время как консольного приложения не было, а по умолчанию было 64 бит, это сделало структуры несогласованными. Добавление этой директивы в консольное приложение разрешает проблему. Я действительно благодарен Дэвиду – Krazibit312

Смежные вопросы