从 void* 到 DWORD 的指针截断

Pointer Truncation from void* to DWORD

我正在为项目使用 control library for Visual C++,如果我在 x32 版本中构建它,它会完美运行。对于我的项目,我需要它是 x64,所以我尝试在 Visual Studio 中用 x64 编译它。但我收到了一些警告:

这是第 17 行。

    rv = midiInOpen(&handle_, device_idx, (DWORD)(void*)midi_in_proc_static_, (DWORD_PTR)this, CALLBACK_FUNCTION);

如何将其更改为 x64 版本?我是否必须更改 Project Proberties 中的某些内容?

对于现代的 windows API 你应该使用 DWORD_PTR 来处理这种事情,它可以是 32 位或 64 位,具体取决于构建设置。如果库指定 DWORD 并且您无法重建,您可能无法在 64 位构建中使用它。

我很确定你做错了。 Here's the MSDN documentation 关于 midiInOpen() 功能。

其原型为:

MMRESULT midiInOpen(
   LPHMIDIIN lphMidiIn,
   UINT      uDeviceID,
   DWORD_PTR dwCallback, // This is DWORD_PTR not DWORD
   DWORD_PTR dwCallbackInstance,
   DWORD     dwFlags
);

所以将 void* 转换为 DWORD 是没有意义的,这不是预期的类型。你应该直接把它转换成DWORD_PTR.