IPortableDevice::SendCommand 方法 (portabledeviceapi.h)
SendCommand 方法将命令发送到设备,并同步检索结果。
语法
HRESULT SendCommand(
[in] const DWORD dwFlags,
[in] IPortableDeviceValues *pParameters,
[out] IPortableDeviceValues **ppResults
);
参数
[in] dwFlags
当前未使用;指定零。
[in] pParameters
指向 IPortableDeviceValues 接口的 指针,该接口指定要在设备上调用的命令和参数。 此接口必须包含以下两个值以指示命令。 其他参数因命令而异。 有关每个命令所需的参数列表,请参阅 命令。
命令或属性 | 说明 |
---|---|
WPD_PROPERTY_COMMON_COMMAND_CATEGORY | 要发送的命令的类别 GUID 。 例如,若要重置设备,需要发送 WPD_COMMAND_COMMON_RESET_DEVICE.fmtid。 |
WPD_PROPERTY_COMMON_COMMAND_ID | 要发送的命令的 PID。 例如,若要重置设备,需要发送 WPD_COMMAND_COMMON_RESET_DEVICE.pid。 |
[out] ppResults
一个变量的地址,该变量接收指向 IPortableDeviceValues 接口的 指针,该接口指示命令结果(包括成功或失败)以及设备返回的任何命令值。 调用方在使用完此接口后必须释放此接口。 检索的值因命令而异;请参阅 命令 中的相应命令文档,了解每个命令调用返回的值。
返回值
返回的值指示发送命令并从驱动程序返回结果是成功还是失败;它并不指示驱动程序是否支持命令,也不指示它在处理命令时是否遇到一些错误。 (有关详细信息,请参阅 Remarks.) 这些错误在 ppResults 参数的 HRESULT 值中返回。 此方法返回的可能 HRESULT 值包括但不限于下表中的值。
返回代码 | 说明 |
---|---|
|
驱动程序已成功接收命令。 这并不表示命令本身成功,必须检查 ppResults 来确定命令的成功或失败。 |
|
至少有一个参数是 NULL 指针。 |
注解
此函数用于将命令直接发送到驱动程序。 命令是发送到驱动程序以指示预期操作的 PROPERTYKEY ,以及所需参数的列表。 每个命令都有一个必需参数和可选参数和结果的列表,这些参数和结果必须与 命令一起打包,驱动程序才能执行请求的操作。 命令中提供了由 Windows 可移植设备定义的命令列表,其中包含所需的参数和返回值。
大多数 Windows 可移植设备方法实际上都通过为你发送一个或多个 Windows Portable Devices 命令并包装参数来工作。 某些命令没有相应的 Windows 可移植设备方法。 调用这些命令的唯一方法是使用 SendCommand。 以下命令没有相应的方法:
- WPD_COMMAND_COMMON_RESET_DEVICE
- WPD_COMMAND_DEVICE_HINTS_GET_CONTENT_LOCATION
- WPD_COMMAND_SMS_SEND
- WPD_COMMAND_STILL_IMAGE_CAPTURE_INITIATE
- WPD_COMMAND_STORAGE_EJECT
某些自定义命令可能需要特定的输入/输出控制代码 (IOCTL) 访问级别。 应用程序通过在传递给 SendCommand 方法的命令参数上调用 IPortableDeviceValues::SetUnsignedIntegerValue 方法来设置此访问级别。 例如,如果自定义命令需要只读访问权限,则调用 SetUnsignedIntegerValue 并将WPD_API_OPTION_IOCTL_ACCESS作为第一个参数传递,FILE_READ_ACCESS作为第二个参数传递。 通过更新这些命令参数,应用程序可确保 Windows 可移植设备 API 使用只读 IOCTL 发出命令。
驱动程序在处理命令时遇到的错误由 ppResults 参数而不是 SendCommand 返回值检索。 此方法的返回值是向驱动程序发送命令时遇到的任何错误 (或成功) 代码。
如果驱动程序不支持指定的命令,则此方法将成功,但返回的 ppResults 参数中唯一有保证的元素将WPD_PROPERTY_COMMON_HRESULT,其中包含E_NOTIMPL。 可以通过在调用命令之前调用 IPortableDeviceCapabilities::GetSupportedCommands 来验证驱动程序是否支持命令。
如果命令支持 (选项(如递归删除或) 删除非递归删除),可以通过调用 IPortableDeviceCapabilities::GetCommandOptions 来查询支持的选项。
在调用 SendCommand 时没有设置超时的选项,但开发人员可以通过从单独的线程调用 IPortableDevice::Cancel 来尝试取消该命令。
示例
//
void ResetDevice(IPortableDevice* pDevice)
{
HRESULT hr = S_OK;
CComPtr<IPortableDeviceValues> pDevValues;
hr = CoCreateInstance(CLSID_PortableDeviceValues,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceValues,
(VOID**) &pDevValues);
if (SUCCEEDED(hr))
{
if (pDevValues != NULL)
{
hr = pDevValues->SetGuidValue(WPD_PROPERTY_COMMON_COMMAND_CATEGORY,
WPD_COMMAND_COMMON_RESET_DEVICE.fmtid);
if (FAILED(hr))
{
printf("! IPortableDeviceValues::SetGuidValue failed, hr= 0x%lx\n", hr);
}
hr = pDevValues->SetUnsignedIntegerValue(WPD_PROPERTY_COMMON_COMMAND_ID,
WPD_COMMAND_COMMON_RESET_DEVICE.pid);
if (FAILED(hr))
{
printf("! IPortableDeviceValues::SetGuidValue failed, hr= 0x%lx\n", hr);
}
}
}
hr = pDevice->SendCommand(0, pDevValues, &pDevValues);
if (FAILED(hr))
{
printf("! Failed to reset the device, hr = 0x%lx\n",hr);
}
else
printf("Device successfully reset\n");
return;
}
//
要求
要求 | 值 |
---|---|
目标平台 | Windows |
标头 | portabledeviceapi.h |
Library | PortableDeviceGUIDs.lib |