DeviceIocontrol API函数将执行什么操作?

时间:2011-02-17 11:28:46

标签: delphi visual-c++

请解释这个VC ++代码的作用是什么?是否可以将此代码转换为Delphi2010?

void CDMOnLineView::OnActionGetdata()
{
    bool retCode;
    DWORD retByte = 0;
    int TmpHigh, TmpLow;
    UCHAR HIDData[64];
    int LastX, LastY;
    UCHAR Button;
    CDC* pViewDC = GetDC();

    if(yPos > 500) yPos = 0;
    else yPos = yPos + 16;  

    if(hDriver == NULL)
    {
        pViewDC->TextOut(10,yPos,"Driver not connect yet.");
    }
    else
    {
        IO_Param.CallerHandle = m_hWnd;
        IO_Param.Model = DM_A4;
        retCode = DeviceIoControl(hDriver, IOCTL_DM_READ_DATA, &IO_Param, sizeof(DM_PARAM), HIDData, 
                                6, &retByte, NULL);
        if(retCode)
        {
            if(retByte != 0)
            {
                Button = HIDData[1] & 0x01;
                TmpLow = (int)HIDData[2];
                TmpHigh = (int)HIDData[3];
                LastX = (TmpLow & 0x00FF) | ((TmpHigh << 8) & 0xFF00);
                TmpLow = (int)HIDData[4];
                TmpHigh = (int)HIDData[5];
                LastY = (TmpLow & 0x00FF) | ((TmpHigh << 8) & 0xFF00);
                sprintf(szStringBuffer, "Button: %d, X: %.5d, Y: %.5d", Button, LastX, LastY);
                pViewDC->TextOut(10,yPos,szStringBuffer, strlen(szStringBuffer));
            }
            else pViewDC->TextOut(10,yPos,"Return bytes incorrect.");
        }
        else
        {
            ErrorCode = GetLastError();
            sprintf(szStringBuffer, "Call IOCTL_DM_READ_DATA fail. Error: %d", ErrorCode);
            pViewDC->TextOut(10,yPos,szStringBuffer, strlen(szStringBuffer));
        }
    }

    ReleaseDC(pViewDC);
}

DeviceIocontrol函数会做什么?请尝试解释参数。

谢谢大家。

3 个答案:

答案 0 :(得分:3)

以下是代码中所有这些按位操作的“翻译”,希望这些可以帮助您:

您需要了解的运营商:

  • &作为按位AND运算符。
  • |是按位OR运算符
  • <<是按位SHIFT LEFT运算符

翻译:

Button = HIDData[1] & 0x01; // C
Button := HIDData[1] and $01; // Delphi

TmpLow = (int)HIDData[2]; // C
TmpLow := Integer(HIDData[2]); // Delphi

TmpHigh = (int)HIDData[3]; // C
TmpHigh := Integer(HidData[3]); // Delphi

LastX = (TmpLow & 0x00FF) | ((TmpHigh << 8) & 0xFF00); // C
LastX := (TmpLow and $00FF) or ((TmpHigh shl 8) and $FF00); // Delphi

TmpLow = (int)HIDData[4]; // C
TmpLow := Integer(HIDData[4]); // Delphi

TmpHigh = (int)HIDData[5]; // C
TmpHigh := Integer(HIDData[5]); // Delphi

LastY = (TmpLow & 0x00FF) | ((TmpHigh << 8) & 0xFF00); // C
LastY := (TmpLow and $00FF) or ((TmpHigh shl 8) and $FF00); // Delphi

sprintf(szStringBuffer, "Button: %d, X: %.5d, Y: %.5d", Button, LastX, LastY); // C
pViewDC->TextOut(10,yPos,szStringBuffer, strlen(szStringBuffer)); // C

Caption := Format('Button: %d, x: %.5d, y: %.5d', [Button, LastX, LastY]); // Delphi

答案 1 :(得分:1)

DeviceIoControl调用自定义驱动程序函数。驱动程序是代表某些计算机设备的内核模式程序。驱动程序具有标准操作(如打开,关闭,读取,写入,使用CreateFile,CloseHandle,ReadFile和WriteFile API调用)和使用DeviceIoControl调用的自定义驱动程序特定操作。有关这些操作的详细信息,请参阅驱动程序文档。

每个自定义操作都有通用接口:操作代码,输入和输出缓冲区,可能包含任何信息。

答案 2 :(得分:-1)

DeviceIoControl功能为documented at MSDN。用户模式程序使用它与设备驱动程序进行交互。

转换此代码非常简单。对DeviceIoControl的调用通过简单的方式进行映射。您可能会遇到的唯一区域是C按位操作。如果您没有K&R的副本,那么您应该这样做!