首页 文章

vc 64位dll参数大小不正确

提问于
浏览
1

我只是尝试使用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 回答

  • 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位构建和64位构建中显示正确的值“12345” .

    然后我在函数的开头放了两个断点,如下所示:

    enter image description here

    我注意到,当我在第一个断点处断开时,参数显示的值是错误的,当编译为64位时看起来是随机的,但在编译为32位时是正确的 . 但是,当我在第二个断点处断开时,两个环境中的值都是正确的 .

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

相关问题