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 的东西没有区别。我毫不怀疑这是一个愚蠢的错误,但我一直在竭尽全力想弄清楚。

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

我认为您只是在调试方面遇到了问题。我以这种方式更改了 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 位编译时是正确的。但是,当我在第二个断点处断时,两个环境中的值都是正确的。

所以,这似乎是调试器的问题。函数刚好开始的第一个断点似乎命中得太早,调试器无法显示正确的值。