Compartir a través de


Comandos extendidos por el proveedor

Una aplicación puede enviar un comando arbitrario al dispositivo a través del método IWiaItemExtras::Escape, que se describe en la documentación de Microsoft Windows SDK. Al llamar a QueryInterface en el elemento raíz, puede recuperar un puntero a la interfaz IWiaItemExtras . Después, la aplicación puede construir un comando PTP mediante cualquier código de operación y parámetros, y enviar este comando al dispositivo. La aplicación también puede enviar datos a o recibir datos del dispositivo.

El dispositivo informa a la aplicación del resultado de la operación cuando se devuelve el método IWiaItemExtras::Escape , rellenando un código de respuesta y parámetros de respuesta en una estructura de PTP_VENDOR_DATA_OUT . Se omiten los miembros SessionId y TransactionId de la estructura de PTP_VENDOR_DATA_IN . El controlador proporciona valores correctos para estos.

Para los comandos definidos por el proveedor que no sean ESCAPE_PTP_CLEAR_STALLS, se debe combinar una marca especial, ESCAPE_PTP_VENDOR_COMMAND, con el comando usado en el método IWiaItemExtras::Escape . Si un comando definido por el proveedor crea o elimina un objeto en el dispositivo mediante las siguientes marcas descritas, el controlador agrega o quita el objeto de sus estructuras internas y genera un evento WIA. Todos los demás comandos estándar deben emitirse a través de la interfaz WIA adecuada.

El primer parámetro de IWiaItemExtras::Escape es la combinación de una o varias de las marcas siguientes:

Código de escape Significado
ESCAPE_PTP_ADD_OBJ_CMD Se agrega un objeto y el identificador del objeto se encuentra en uno de los parámetros de comando.
ESCAPE_PTP_REM_OBJ_CMD Se quita un objeto y el identificador del objeto se encuentra en uno de los parámetros de comando.
ESCAPE_PTP_ADD_OBJ_RESP Se agrega un objeto y el identificador del objeto se encuentra en uno de los parámetros de respuesta.
ESCAPE_PTP_REM_OBJ_RESP Se quita un objeto y el identificador del objeto se encuentra en uno de los parámetros de respuesta.
ESCAPE_PTP_ADDREM_PARM1 El identificador del objeto agregado o quitado se encuentra en el primer parámetro del comando o respuesta.
ESCAPE_PTP_ADDREM_PARM2 El identificador del objeto agregado o quitado se encuentra en el segundo parámetro del comando o la respuesta.
ESCAPE_PTP_ADDREM_PARM3 El identificador del objeto agregado o quitado se encuentra en el tercer parámetro del comando o respuesta.
ESCAPE_PTP_ADDREM_PARM4 El identificador del objeto agregado o quitado se encuentra en el cuarto parámetro del comando o la respuesta.
ESCAPE_PTP_ADDREM_PARM5 El identificador del objeto agregado o quitado se encuentra en el quinto parámetro del comando o la respuesta.
ESCAPE_PTP_CLEAR_STALLS Borre las condiciones de error causadas por un comando extendido por el proveedor. Esta marca no se puede usar en combinación con ninguna de las otras marcas. Para obtener más información sobre esta marca, vea la nota que sigue a esta tabla.
ESCAPE_PTP_VENDOR_COMMAND El comando es un comando extendido por el proveedor.

Cuando una aplicación llama a IWiaItemExtras::Escape con la marca ESCAPE_PTP_CLEAR_STALL como primer argumento para este método, el controlador emite la solicitud PTP Get Device Status para determinar si los puntos de conexión están en una condición STALL. Si el comando Obtener estado del dispositivo se realiza correctamente, el controlador emite el IOCTL_RESET_PIPE código de control USB para cada punto de conexión de este tipo. Si se produce un error en el comando Obtener estado del dispositivo , el controlador emite una solicitud de restablecimiento de dispositivo PTP. Obtener el estado del dispositivo y el restablecimiento del dispositivo se describen en el estándar PIMA 15740:2000, primera edición y revisión 1.0 de la definición del dispositivo de captura de imágenes fijas USB (SICDD USB).

En el código de ejemplo siguiente se muestra cómo usar la interfaz de comandos extendida por el proveedor. Asegúrese de que el código incluye el encabezado ptpusd.h , ya que contiene las definiciones de los códigos de escape y otras constantes, y las estructuras PTP_VENDOR_DATA_IN y PTP_VENDOR_DATA_OUT . La interfaz IWiaItemExtras se obtiene mediante una llamada a QueryInterface en el elemento raíz. Un puntero a este elemento raíz, pIWiaRootItem, se puede obtener, por ejemplo, mediante una llamada a IWiaDevMgr::SelectDeviceDlg (descrito en la documentación de 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.
//