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

C++ vc++;64位dll参数大小不正确,c++,visual-c++,32bit-64bit,visual-studio-debugging,C++,Visual C++,32bit 64bit,Visual Studio Debugging,我只是尝试创建一个简单的DLL,使用VC++(VS2015)使用单个导出函数,并从Win32应用程序调用此函数。我正在测试以x86和x64构建配置构建dll和exe 当编译为x86时,一切正常,但是当我编译为x64并进入dll函数调用时,函数参数都是垃圾数据 我在包含在DLL和应用程序项目中的头文件中定义了如下函数: #ifdef CPPDLL_EXPORTS #define CPPDLL_API __declspec(dllexport) #else #define CPPDLL_API

我只是尝试创建一个简单的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位编译时是正确的。但是,当我在第二个断点处中断时,两种环境中的值都是正确的


因此,这似乎是调试器的一个问题。函数开始处的第一个断点似乎太早了,调试器无法显示正确的值。

请提供一个完整的mcve项目。在我更改包含路径以查找标头后,它对我来说效果很好。最初它确实愚弄了我,因为它更改了不同生成配置的属性它实际上是在构建(平台是错误的,我构建的是x64,它正在更改Win32。Nit:LPCWSTR的转换是不必要的(如果
s
实际上是type
std::string
,则可能隐藏错误)。谢谢。我相信你是对的。正如你所猜测的,我在进入函数(或函数上设置的断点)时,只是通过调试器查看参数值。