2016-11-01 9 views
1

Я просто пытаюсь создать простую DLL с одной экспортированной функцией с помощью VC++ (VS2015) и вызывать эту функцию из приложения Win32. Я тестирую построение dll и exe в конфигурациях сборки x86 и x64.vC++ 64-bit dll неправильные размеры параметров

Все работает так, как ожидалось, при компиляции как x86, однако, когда я компилирую как x64 и вступаю в вызов функции dll, параметры функции - это все данные мусора.

У меня есть функция, определенная следующим образом в заголовочном файле, который включен как в DLL и приложения проекта:

#ifdef CPPDLL_EXPORTS 
#define CPPDLL_API __declspec(dllexport) 
#else 
#define CPPDLL_API __declspec(dllimport) 
#endif 

extern "C" CPPDLL_API void __cdecl CallDll(LONG64 value, bool trueOrFalse); 

Это как функция реализуется в DLL:

extern "C" CPPDLL_API void __cdecl CallDll(LONG64 value, bool trueOrFalse) 
{ 
    return; 
} 

Так вызывается функция в приложении:

CallDll(12345, true); 

Изменение параграфа метр от LONG64 до чего-то типа int не имеет значения. Я не сомневаюсь, что это глупая ошибка, но я вытаскиваю свои волосы, пытаясь понять это.

Весь образец проекта: https://1drv.ms/u/s!AiwVLuwdzWP_zZ0tSDA15ZqL9QgKXQ

+0

Пожалуйста обеспечивают [mcve] (http://stackoverflow.com/help/mcve) – NineBerry

+0

Добавлен весь mcve проект – user7101086

+0

Он работал хорошо для меня после того, как я изменил включать путь, чтобы найти header.h Это было одурачить меня изначально изменив свойства для другой конфигурации сборки, которая была фактически построена (платформа была неправильной, я создавал x64 и менял Win32. –

ответ

1

Я думаю, что вы только возникли проблемы с отладкой. Я изменил функцию DLL таким образом, чтобы отобразить его переданный параметр:

extern "C" CPPDLL_API void __cdecl CallDll(LONG64 value, bool trueOrFalse) 
{ 
    std::wstring s = std::to_wstring(value); 
    MessageBox(0, s.c_str(), L"Hello World", 0); 
    return; 
} 

Окно сообщения показывает правильное значение «12345» в обоих 32-разрядных сборок, а также 64-разрядные сборки.

Тогда я поставил две точки разрыва в начале функции, как показано здесь:

enter image description here

То, что я заметил, что когда я разбиваю на первой точке останова, показаны значения для параметров неправильно и выглядят случайными при компиляции для 64-битных, но корректны при компиляции для 32-битного. Однако, когда я ломаюсь во второй точке разрыва, значения верны в обеих средах.

Таким образом, это похоже на проблему с отладчиком. Первая точка останова при точном начале функции, похоже, слишком ранна, чтобы отладчик мог показывать правильные значения.

+0

Nit: Приведение в LPCWSTR не требуется (и может скрыть ошибку, если 's' было фактически type 'std :: string'). –

+0

@MartinBonner Да, удалено в коде – NineBerry

+0

Спасибо. Я считаю, что вы правы. Я смотрел только значения параметров через отладчик при входе в функцию (или точку останова установленный на функцию), как вы догадались. – user7101086

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

  • Нет связанных вопросов^_^