vc++ 64 位 dll 参数大小不正确
vc++ 64-bit dll incorrect parameter sizes
我只是想创建一个简单的 DLL,使用 VC++ (VS2015) 的单个导出函数,并从 Win32 应用程序调用此函数。我正在测试在 x86 和 x64 构建配置中构建 dll 和 exe。
编译为 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 的东西没有区别。我毫不怀疑这是一个愚蠢的错误,但我一直在竭尽全力想弄清楚。
我认为您只是在调试方面遇到了问题。我以这种方式更改了 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 位版本和 64 位版本中都显示正确的值“12345”。
然后我在函数的开头放置了两个断点,如下所示:
我注意到,当我在第一个断点处中断时,显示的参数值是错误的,并且在为 64 位编译时看起来是随机的,但在为 32 位编译时是正确的。但是,当我在第二个断点处断时,两个环境中的值都是正确的。
所以,这似乎是调试器的问题。函数刚好开始的第一个断点似乎命中得太早,调试器无法显示正确的值。
我只是想创建一个简单的 DLL,使用 VC++ (VS2015) 的单个导出函数,并从 Win32 应用程序调用此函数。我正在测试在 x86 和 x64 构建配置中构建 dll 和 exe。
编译为 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 的东西没有区别。我毫不怀疑这是一个愚蠢的错误,但我一直在竭尽全力想弄清楚。
我认为您只是在调试方面遇到了问题。我以这种方式更改了 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 位版本和 64 位版本中都显示正确的值“12345”。
然后我在函数的开头放置了两个断点,如下所示:
我注意到,当我在第一个断点处中断时,显示的参数值是错误的,并且在为 64 位编译时看起来是随机的,但在为 32 位编译时是正确的。但是,当我在第二个断点处断时,两个环境中的值都是正确的。
所以,这似乎是调试器的问题。函数刚好开始的第一个断点似乎命中得太早,调试器无法显示正确的值。