vc ++ 64位dll参数大小不正确

时间:2016-11-01 18:16:33

标签: c++ visual-c++ 32bit-64bit visual-studio-debugging

我只是尝试使用VC ++(VS2015)创建一个简单的DLL,使用单个导出函数,并从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的内容没有区别。我毫不怀疑这是一个愚蠢的错误,但我一直在努力解决这个问题。

整个示例项目: https://1drv.ms/u/s!AiwVLuwdzWP_zZ0tSDA15ZqL9QgKXQ

1 个答案:

答案 0 :(得分: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位时是正确的。但是,当我在第二个断点处断开时,两个环境中的值都是正确的。

所以,这似乎是调试器的一个问题。函数的确切开头的第一个断点似乎太早,以至于调试器无法显示正确的值。