从 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
.
我正在为项目使用 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
.