Udostępnij przez


Komendy rozszerzone dostawców

Aplikacja może wysłać dowolne polecenie do urządzenia za pomocą metody IWiaItemExtras::Escape opisanej w dokumentacji zestawu Microsoft Windows SDK. Wywołując QueryInterface na elemencie głównym, można pobrać wskaźnik do interfejsu IWiaItemExtras. Aplikacja może następnie skonstruować polecenie PTP przy użyciu dowolnego kodu i parametrów oraz wysłać to polecenie do urządzenia. Aplikacja może również wysyłać dane do urządzenia lub odbierać je z urządzenia.

Urządzenie informuje aplikację o wyniku operacji, gdy metoda IWiaItemExtras::Escape zwraca, uzupełniając kod odpowiedzi i parametry odpowiedzi w strukturze PTP_VENDOR_DATA_OUT. Elementy SessionId i TransactionId struktury PTP_VENDOR_DATA_IN są ignorowane. Sterownik dostarcza poprawne wartości dla tych elementów.

W przypadku poleceń zdefiniowanych przez dostawcę innych niż ESCAPE_PTP_CLEAR_STALLS należy połączyć specjalną flagę ESCAPE_PTP_VENDOR_COMMAND (przy użyciu operatora OR) z poleceniem używanym w metodzie IWiaItemExtras::Escape . Jeśli polecenie zdefiniowane przez dostawcę tworzy lub usuwa obiekt na urządzeniu przy użyciu następujących opisanych flag, sterownik dodaje lub usuwa obiekt ze struktur wewnętrznych i generuje zdarzenie WIA. Wszystkie inne standardowe polecenia powinny być wydawane za pośrednictwem odpowiedniego interfejsu WIA.

Pierwszy parametr IWiaItemExtras::Escape jest kombinacją co najmniej jednej z następujących flag:

Kod ucieczki Znaczenie
ESCAPE_PTP_ADD_OBJ_CMD Obiekt jest dodawany, a uchwyt dla obiektu znajduje się w jednym z parametrów polecenia.
ESCAPE_PTP_REM_OBJ_CMD Obiekt jest usuwany, a uchwyt obiektu znajduje się w jednym z parametrów polecenia.
ESCAPE_PTP_ADD_OBJ_RESP Obiekt jest dodawany, a uchwyt dla obiektu znajduje się w jednym z parametrów odpowiedzi.
ESCAPE_PTP_REM_OBJ_RESP Obiekt jest usuwany, a uchwyt obiektu znajduje się w jednym z parametrów odpowiedzi.
ESCAPE_PTP_ADDREM_PARM1 Uchwyt dla dodanego lub usuniętego obiektu znajduje się w pierwszym parametrze polecenia lub odpowiedzi.
ESCAPE_PTP_ADDREM_PARM2 Uchwyt dla dodanego lub usuniętego obiektu znajduje się w drugim parametrze polecenia lub odpowiedzi.
ESCAPE_PTP_ADDREM_PARM3 Uchwyt dla dodanego lub usuniętego obiektu znajduje się w trzecim parametrze polecenia lub odpowiedzi.
ESCAPE_PTP_ADDREM_PARM4 Uchwyt dla dodanego lub usuniętego obiektu znajduje się w czwartym parametrze polecenia lub odpowiedzi.
ESCAPE_PTP_ADDREM_PARM5 Uchwyt dla dodanego lub usuniętego obiektu znajduje się w piątym parametrze polecenia lub odpowiedzi.
ESCAPE_PTP_CLEAR_STALLS Wyczyść wszelkie warunki błędu spowodowane przez rozszerzone polecenie dostawcy. Tej flagi nie można używać w połączeniu z żadnymi innymi flagami. Aby uzyskać więcej informacji na temat tej flagi, zobacz notatkę, która następuje po tej tabeli.
ESCAPE_PTP_VENDOR_COMMAND Polecenie jest poleceniem rozszerzonym dostawcy.

Gdy aplikacja wywołuje IWiaItemExtras::Escape z flagą ESCAPE_PTP_CLEAR_STALL jako pierwszy argument tej metody, sterownik wystawia żądanie PTP Get Device Status w celu sprawdzenia, czy jakiekolwiek punkty końcowe znajdują się w stanie STALL. Jeśli polecenie Pobierz stan urządzenia powiedzie się, sterownik wysyła kod sterujący IOCTL_RESET_PIPE USB dla każdego takiego punktu końcowego. Jeśli polecenie Pobierz stan urządzenia zakończy się niepowodzeniem, sterownik wysyła żądanie resetowania urządzenia PTP. Pobierz stan urządzenia i resetowanie urządzenia są opisane w standardzie PIMA 15740:2000, First Edition i Revision 1.0 definicji urządzenia przechwytywania obrazów USB (SICDD USB).

Poniższy przykładowy kod ilustruje sposób używania interfejsu polecenia rozszerzonego dostawcy. Upewnij się, że kod zawiera nagłówek ptpusd.h , ponieważ zawiera definicje kodów ucieczki i innych stałych oraz struktury PTP_VENDOR_DATA_IN i PTP_VENDOR_DATA_OUT . Interfejs IWiaItemExtras jest uzyskiwany przy użyciu wywołania queryInterface w elemencie głównym. Wskaźnik do tego elementu głównego, pIWiaRootItem, można uzyskać, na przykład przez wywołanie IWiaDevMgr::SelectDeviceDlg (opisane w dokumentacji zestawu Microsoft Windows SDK).

//
// Test IWiaItemExtras::Escape method
//
HRESULT hr = S_OK;
IWiaItemExtras *pIWiaItemExtras = NULL;

hr = pIWiaRootItem->QueryInterface(IID_IWiaItemExtras,
                                   (VOID **) &pIWiaItemExtras);
if (FAILED(hr)) {
    MessageBox("QueryInterface for IWiaItemExtras failed");
    return;
}

PTP_VENDOR_DATA_IN *pDataIn = NULL;
PTP_VENDOR_DATA_OUT *pDataOut = NULL;
DWORD dwDataInSize = SIZEOF_REQUIRED_VENDOR_DATA_IN;
DWORD dwDataOutSize = SIZEOF_REQUIRED_VENDOR_DATA_OUT + 0x1000;
DWORD dwActualDataOutSize = 0;

pDataIn = (PTP_VENDOR_DATA_IN *) CoTaskMemAlloc(dwDataInSize);
if (!pDataIn) {
    MessageBox("CoTaskMemAlloc failed");
    return;
}

pDataOut = (PTP_VENDOR_DATA_OUT *) CoTaskMemAlloc(dwDataOutSize);
if (!pDataOut) {
 CoTaskMemFree(pDataIn);
    MessageBox("CoTaskMemAlloc failed");
    return;
}
ZeroMemory(pDataIn, dwDataInSize);
ZeroMemory(pDataOut, dwDataOutSize);

pDataIn->OpCode = 0x1001;
pDataIn->SessionId = 0;     // The driver will fill this in.
pDataIn->TransactionId = 0; // The driver will fill this in.
pDataIn->NumParams = 0;

//
// pDataIn->NextPhase informs the PTP driver whether to 
// read data from the device (as shown), or
// write data to the device (use PTP_NEXTPHASE_WRITE_DATA),
// to neither read nor write data (use PTP_NEXTPHASE_NO_DATA).
//
pDataIn->NextPhase = PTP_NEXTPHASE_READ_DATA;

hr = pIWiaItemExtras->Escape(ESCAPE_PTP_VENDOR_COMMAND,
                             (BYTE *) pDataIn, dwDataInSize,
                             (BYTE *) pDataOut, dwDataOutSize,
                             &dwActualDataOutSize);

if (FAILED(hr)) {
    MessageBox("Escape failed");
    return;
}

//
// Data returned from device is located at pDataOut->VendorReadData.
//