大约 2 年前,我开发了一个需要使用 WinUSB 的应用程序,它在我的脑海中并不新鲜,但现在查看我的代码,我可以看到我确实使用了这个函数:SetupDiEnumDeviceInfo,但我记得这不是问题我。
您可能知道,WinUSB 是 Windows 的 API,用于与 USB 硬件进行通信。硬件必须已经有它的驱动程序,所以,你必须知道你的设备的 GUID
回答您的步骤:
1. 签名目录是从 inf 生成的 .cat 文件,您可以使用 inf2cat.exe 生成它,它位于您机器的某个位置。这只是签署您的 winusb 驱动程序的一个步骤。要签署它,您需要为 WHQL(Windows 硬件质量实验室)http://www.microsoft.com/whdc/whql/提交您的 .inf 和 .cat 文件,目前这并不重要,我我从来没有签署过我的 WinUSB 驱动程序,它在 x64 机器上工作,带有一个不雅的警告,说我的 WinUSB 驱动程序可能很危险(尽管它不是!)
2.您正在开发的应用程序不需要知道.inf文件在哪里,.inf文件是为了安装WinUSB驱动程序,驱动程序安装后应用程序将通过设备的GUID号与驱动程序通信正确安装。这是正确安装 WinUSB 驱动程序后连接到设备所需的部分代码。
LPGUID _lpGuid = (LPGUID) malloc (sizeof(GUID));
HRESULT result = CLSIDFromString (L"{A54E04AD-E06A-4A03-95BB-25AACC4E6CCA}", _lpGuid);
...
bResult = SetupDiEnumDeviceInterfaces(deviceInfo,
NULL,
_lpGuid,
0,
&interfaceData); //If the function succeeds
//the return value is nonzero.
// [1]
deviceInfo = SetupDiGetClassDevs(_lpGuid,
NULL, NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (deviceInfo == INVALID_HANDLE_VALUE)
{
//lblDispStatus->Caption = "Erro 1 - deviceInfo";
return false;
}
// [2]
interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
bResult = SetupDiEnumDeviceInterfaces(deviceInfo,
NULL,
_lpGuid,
0,
&interfaceData); //If the function succeeds
//the return value is nonzero.
InterfaceData 作为引用传递,因此您将能够调用下一个函数,即 SetupDiGetDeviceInterfaceDetail
3.驱动是谁开发的?他必须知道您需要的 GUID。
我从 WinUSB 了解到的所有信息,我都在糟糕的 WinUSB 文档中找到,你需要大量的专利才能阅读他们所有的混乱信息。对于您的不幸,我的脑海中并不新鲜,知道吗,我必须深入研究这个主题才能为您提供更多帮助。
这个页面似乎很重要,看看这个:http: //msdn.microsoft.com/en-us/library/windows/hardware/ff540174%28v=vs.85%29.aspx