공급업체 확장 명령
애플리케이션은 Microsoft Windows SDK 설명서에 설명된 IWiaItemExtras::Escape 메서드를 통해 임의의 명령을 디바이스에 보낼 수 있습니다. 루트 항목에서 QueryInterface 를 호출하면 IWiaItemExtras 인터페이스에 대한 포인터를 검색할 수 있습니다. 그런 다음 애플리케이션은 opcode 및 매개 변수를 사용하여 PTP 명령을 생성하고 이 명령을 디바이스로 보낼 수 있습니다. 애플리케이션은 디바이스로 데이터를 보내거나 디바이스에서 데이터를 받을 수도 있습니다.
디바이스는 IWiaItemExtras::Escape 메서드가 반환되면 작업 결과를 애플리케이션에 알리고 PTP_VENDOR_DATA_OUT 구조에서 응답 코드 및 응답 매개 변수를 채웁니다. PTP_VENDOR_DATA_IN 구조체의 SessionId 및 TransactionId 멤버는 무시됩니다. 드라이버는 이러한 값에 대해 올바른 값을 제공합니다.
ESCAPE_PTP_CLEAR_STALLS 이외의 공급업체 정의 명령의 경우 특수 플래그인 ESCAPE_PTP_VENDOR_COMMAND IWiaItemExtras::Escape 메서드에서 사용되는 명령과 결합해야 합니다(OR 연산자 사용). 공급업체 정의 명령이 다음 설명된 플래그를 사용하여 디바이스에서 개체를 만들거나 삭제하는 경우 드라이버는 내부 구조에서 개체를 추가하거나 제거하고 WIA 이벤트를 생성합니다. 다른 모든 표준 명령은 적절한 WIA 인터페이스를 통해 실행되어야 합니다.
IWiaItemExtras::Escape에 대한 첫 번째 매개 변수는 다음 플래그 중 하나 이상의 조합입니다.
이스케이프 코드 | 의미 |
---|---|
ESCAPE_PTP_ADD_OBJ_CMD | 개체가 추가되고 개체의 핸들이 명령 매개 변수 중 하나에 있습니다. |
ESCAPE_PTP_REM_OBJ_CMD | 개체가 제거되고 개체의 핸들이 명령 매개 변수 중 하나에 있습니다. |
ESCAPE_PTP_ADD_OBJ_RESP | 개체가 추가되고 개체의 핸들이 응답 매개 변수 중 하나에 있습니다. |
ESCAPE_PTP_REM_OBJ_RESP | 개체가 제거되고 개체의 핸들이 응답 매개 변수 중 하나에 있습니다. |
ESCAPE_PTP_ADDREM_PARM1 | 추가되거나 제거된 개체에 대한 핸들은 명령 또는 응답의 첫 번째 매개 변수에 있습니다. |
ESCAPE_PTP_ADDREM_PARM2 | 추가되거나 제거된 개체에 대한 핸들은 명령 또는 응답의 두 번째 매개 변수에 있습니다. |
ESCAPE_PTP_ADDREM_PARM3 | 추가되거나 제거된 개체에 대한 핸들은 명령 또는 응답의 세 번째 매개 변수에 있습니다. |
ESCAPE_PTP_ADDREM_PARM4 | 추가되거나 제거된 개체에 대한 핸들은 명령 또는 응답의 네 번째 매개 변수에 있습니다. |
ESCAPE_PTP_ADDREM_PARM5 | 추가되거나 제거된 개체에 대한 핸들은 명령 또는 응답의 다섯 번째 매개 변수에 있습니다. |
ESCAPE_PTP_CLEAR_STALLS | 공급업체 확장 명령으로 인해 발생하는 오류 조건을 지웁합니다. 이 플래그는 다른 플래그와 함께 사용할 수 없습니다. 이 플래그에 대한 자세한 내용은 이 표 다음에 오는 참고 사항을 참조하세요. |
ESCAPE_PTP_VENDOR_COMMAND | 이 명령은 공급업체 확장 명령입니다. |
애플리케이션이 이 메서드의 첫 번째 인수로 ESCAPE_PTP_CLEAR_STALL 플래그를 사용하여 IWiaItemExtras::Escape 를 호출하는 경우 드라이버는 PTP 디바이스 상태 가져오기 요청을 실행하여 엔드포인트가 STALL 조건에 있는지 확인합니다. 디바이스 상태 가져오기 명령이 성공하면 드라이버는 이러한 각 엔드포인트에 대해 IOCTL_RESET_PIPE USB 제어 코드를 실행합니다. 디바이스 상태 가져오기 명령이 실패하면 드라이버는 PTP 디바이스 재설정 요청을 실행합니다. 디바이스 상태 가져오기 및 디바이스 재설정 은 USB SICDD(USB 스틸 이미지 캡처 디바이스 정의)의 PIMA 15740:2000 표준, 첫 번째 버전 및 수정 버전 1.0에 설명되어 있습니다.
다음 샘플 코드에서는 공급업체 확장 명령 인터페이스를 사용하는 방법을 보여 줍니다. 이스케이프 코드 및 기타 상수의 정의와 PTP_VENDOR_DATA_IN 및 PTP_VENDOR_DATA_OUT 구조체가 포함되어 있으므로 코드에 ptpusd.h 헤더가 포함되어 있는지 확인합니다. IWiaItemExtras 인터페이스는 루트 항목에서 QueryInterface 호출을 사용하여 가져옵니다. 예를 들어 IWiaDevMgr::SelectDeviceDlg(Microsoft Windows SDK 설명서에 설명됨)를 호출하여 이 루트 항목 pIWiaRootItem에 대한 포인터를 가져올 수 있습니다.
//
// 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.
//