gpt4 book ai didi

windows - 64 位 Windows 8.1 和 Qt 上的 MIDI 应用程序 - 指针大小问题

转载 作者:可可西里 更新时间:2023-11-01 09:28:47 26 4
gpt4 key购买 nike

我正在尝试开发一个 C++ Windows 应用程序来处理来自某些 MIDI 设备的 MIDI 信息。我强制使用的操作系统是 Windows 8.1 64 位。开发环境为Qt。

在阅读了大量网页后,我发现 Windows 有一组低级函数来处理 MIDI 数据,允许将 Windows MIDI 驱动程序与任何应用程序连接。这些功能在此处描述 http://msdn.microsoft.com/en-us/library/windows/desktop/dd757277(v=vs.85).aspx

到目前为止,我编写的软件工作正常,我能够在我的应用程序中处理传入的 MIDI 短消息。尽管如此,当涉及到将一些缓冲区从应用程序传递到驱动程序时,反之亦然,软件失败并抛出有关无效内存地址的异常。通过使用调试器,我发现内存地址本身是 64 位地址,但是当驱动程序将地址传回应用程序(实际上是回调)时,它只是 32 位。不仅仅是它的任意 32 位,而是原始 64 位地址的低 32 位。

所以,我很困惑,我有一些问题:1. 我应该使用哪个 Windows SDK?我在哪里可以找到它? (我已经在使用一个,但不确定它是否正确)。2. 是否有 64 位 windows MIDI 功能?我在哪里可以找到它们的文档? (我已经在使用一些,但它们在 win32 API 的大标签下......)

非常感谢您的帮助。

法布里齐奥

更新#1。

这是一段关于回调函数的代码。抛出异常是因为元素 BufferPtr->dwBytesRecorded 不可访问。实际问题是 Windows 数据类型 DWORD 是 unsigned long 的 typedef,但我认为它应该是 long long。在我看来,如果我使用的是正确的 64 位 Windows SDK,则此 typedef 应该已正确设置。

void CALLBACK MIDIInputDevice::MIDIProcessingCallback(HMIDIIN hMidiIn,UINT wMsg,DWORD_PTR dwInstance,DWORD dwParam1,DWORD dwParam2)
{
MIDIInputDevice* ThisDevice;
QString MessageStr;

ThisDevice = (MIDIInputDevice*)dwInstance;
switch (wMsg)
{
case MIM_LONGDATA:

unsigned int ByteIndex;
MIDIHDR* BufferPtr;

BufferPtr = (MIDIHDR*)dwParam1;
MessageStr = QString("Device #%1 - Long data: ")
.arg(ThisDevice->getIndex());
for (ByteIndex = 0; ByteIndex < (BufferPtr->dwBytesRecorded)-1; ByteIndex++)
{
MessageStr.append(QString("%1:").arg(*((BufferPtr->lpData)+ByteIndex),2,16,QChar('0')));
}
MessageStr.append(QString("%1").arg(*((BufferPtr->lpData)+BufferPtr->dwBytesRecorded-1),2,16,QChar('0')));
MessageStr.append(" - Time: %1 ms").arg(dwParam2);
emit ThisDevice->talk(MessageStr);
break;
...

这是我将回调链接到驱动程序的代码行。

LastResult = midiInOpen(&Handle,Index,(DWORD_PTR)(&MIDIInputDevice::MIDIProcessingCallback),(DWORD_PTR)(this),CALLBACK_FUNCTION | MIDI_IO_STATUS);

最佳答案

您已经在使用 64 位界面。你只是错误地使用它。问题出在您的代码中。这是回调的文档:http://msdn.microsoft.com/en-us/library/windows/desktop/dd798460.aspx

这是回调的原型(prototype):

void CALLBACK MidiInProc(
HMIDIIN hMidiIn,
UINT wMsg,
DWORD_PTR dwInstance,
DWORD_PTR dwParam1,
DWORD_PTR dwParam2
);

您的错误是使用了 32 位类型 DWORD 而不是指针大小的 DWORD_PTR。这就是地址被截断的原因。

我相信 MIDIProcessingCallback 是一个静态成员函数。

关于windows - 64 位 Windows 8.1 和 Qt 上的 MIDI 应用程序 - 指针大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27205015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com