0

我真的很感谢winUSB的一些帮助。我遵循了 msdn 网站中列出的所有步骤

http://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/hardware/ff540174(v=vs.85).aspx

我尝试使用 Visual Studio 2010 在 Windows 7 上运行它。即使它编译没有错误,我也无法传递函数 SetupDiEnumDeviceInfo,并且它出错(我认为是错误 #259)。我不知道如何传递这个错误。

但是,我不确定该过程中的几个步骤:

  1. msdn 与“软件包的签名目录文件。此文件是在 x64 版本上安装 WinUSB 所必需的”谈什么?什么是签名目录包?我该如何设置?
  2. 它还谈到了制作一些目录(例如,c:\UsbDevice)以将 .inf 文件放在那里!但是我的VS项目怎么知道我指向c:\UsbDevice,它怎么知道“.inf”文件的名字应该是什么?我应该怎么称呼.inf文件?以及如何指向项目给它?
  3. 在 .inf 文件中有两个 GUID 编号。我可以通过设备管理器获取类 GUID 编号。但是如何设置设备接口 GUID?请帮忙。我得到的错误是否可能是因为我没有正确设置以下项目之一?

谢谢,
--鲁迪

4

1 回答 1

0

大约 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

于 2013-01-25T15:38:51.443 回答