Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
//