winUSB错误(可能.inf问题)

时间:2013-01-25 14:58:56

标签: windows visual-studio-2010 visual-c++ winusb

我真的很感激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

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

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

  1. msdn谈论“包的已签名目录文件。在x64版本上安装WinUSB需要此文件”?什么是签名目录包?我该如何设置?
  2. 它还谈到制作一些目录(例如,c:\ UsbDevice)将.inf文件放在那里!但是我的VS项目如何知道我指向c:\ UsbDevice,它是如何知道“.inf”文件的名称应该是什么?我应该怎样调用.inf文件?以及如何指向项目对吗?
  3. .inf文件中有两个GUID号。我可以通过转到设备管理器获取类GUID号。但是如何设置设备接口GUID? 请帮忙。 我可能遇到的错误是因为我没有正确设置以下项目之一?
  4. 谢谢,
    - 鲁迪

1 个答案:

答案 0 :(得分:0)

我大约2年前开发了一个应用程序,我需要使用WinUSB,它在我脑海中并不新鲜,但现在看着我的代码我可以看到我确实使用了这个函数:SetupDiEnumDeviceInfo,但我记得它不是对我来说是一个问题。

您可能知道,WinUSB是Windows的API,您可以使用USB硬件进行通信。硬件必须已经有了它的驱动程序,因此,您必须知道设备的GUID

回答你的步骤:
1.签名目录是从inf生成的.cat文件,您可以使用inf2cat.exe对其进行生成,它位于您的计算机中。这只是签署winusb驱动程序的一个步骤。要签名,你需要提交你的.inf和.cat文件的WHQL(windows硬件质量实验室)http://www.microsoft.com/whdc/whql/,这一点并不重要,我从未签署过我的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文档中,你需要大量的patiante来阅读他们所有杂乱的信息。而对于你的不幸,在我的脑海中并不新鲜,我知道,我必须深入了解这个主题,以帮助你更多。

此页面看起来很重要,请看一下:http://msdn.microsoft.com/en-us/library/windows/hardware/ff540174%28v=vs.85%29.aspx