Что будет делать функция API DeviceIocontrol? - PullRequest
0 голосов
/ 17 февраля 2011

Пожалуйста, объясните, что делает этот код 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 ]

3 голосов
/ 17 февраля 2011

Вот «перевод» всех этих побитовых операций в коде, надеюсь, они помогут вам:

Операторы, о которых вам нужно знать:

  • & как побитовый оператор 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 голос
/ 17 февраля 2011

DeviceIoControl вызывает пользовательскую функцию драйвера. Драйвер - это программа в режиме ядра, представляющая какое-либо компьютерное устройство. Драйверы имеют стандартные операции (такие как open, close, read, write, которые вызываются с помощью API CreateFile, CloseHandle, ReadFile и WriteFile) и пользовательские специфичные для драйвера операции, которые вызываются с помощью DeviceIoControl. Подробная информация об этих операциях описана в документации драйвера.

Каждая пользовательская операция имеет общий интерфейс: код операции, входной и выходной буферы, которые могут содержать любую информацию.

0 голосов
/ 17 февраля 2011

Функция DeviceIoControl задокументирована в MSDN .Программы пользовательского режима используют его для взаимодействия с драйверами устройств.

Преобразование этого кода довольно просто.Призыв к DeviceIoControl отображается через тривиально.Единственная область, с которой вы, вероятно, будете бороться, это побитовые операции Си.Если у вас нет копии K & R на руках, то вам следует!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...