2016-11-01 25 views
1

我只是想創建一個簡單的DLL,使用VC++(VS2015)的單個導出函數,並從Win32應用程序中調用此函數。我正在測試在x86和x64構建配置中構建dll和exe文件。vC++ 64位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; 
} 

消息框顯示在兩個32位的正確值「12345」建立以及64位版本。

然後我放了兩個破發點,在函數的開頭,如所示:

enter image description here

我注意到的是,當我在第一個破發點突破,顯示的值的參數編譯爲64位時錯誤且看起來是隨機的,但在編譯爲32位時正確。但是,當我在第二個休息點休息時,這兩個環境中的值都是正確的。

所以,這似乎是調試器的問題。在函數的確切開頭處的第一個斷點似乎太早,調試器才能夠顯示正確的值。

+0

Nit:不需要轉換爲LPCWSTR(並且如果's'實際上可以隱藏錯誤輸入'std :: string')。 –

+0

@MartinBonner是的,在代碼中刪除 – NineBerry

+0

謝謝。我相信你是正確的。我只是在通過調試器查看參數的值時,進入函數(或斷點按照你的猜測設置)。 – user7101086