如何在计算机上获取 USB C++ SetupApi.h 以供 .NET 应用程序安装使用

问题描述 投票:0回答:1

故事:

  • 有一个 .NET8 WPF 应用程序,需要连接到各种 USB 串行设备。仅在 Windows 中安装。
  • 想要获取 USB 设备的设备描述符以获取连接时的更多信息。类似于 USB Tree View,它基于 USBView
  • 为了获取这些描述符,我最终创建了一个 C++ 项目,该项目编译为 DLL,然后导入到单独的 .NET 项目中。
  • 使用以下资源来实现此目的:
  • SO问题博客参考从博客修改代码
  • 当我在本地构建时,所有这些都工作正常
  • 重要的是C++代码使用了SetupApi.h引用

具体问题

  • 在开发过程中,我收到与SetupApi.h库相关的(0x8007007E)错误“找不到特定模块”。这导致了添加
    pragma comment
    或将库添加到链接器的解决方案(我尝试了这两种解决方案并且都有效)。 示例在这里
  • 一旦解决了所有这些链接/库问题,就构建了 C++ 包,创建了一个 DLL,导入到我的 C# .NET 程序中,一切正常,在本地。
  • 但是,当我构建我们的软件并将其部署在没有开发环境(即使用 Visual Studio)的计算机上时,我现在对于相同的 SetupApi.h 得到相同的结果(0x8007007E)。这意味着 PC 中没有安装所需的库。

示例代码: C++

#include <iostream>
#include <Windows.h>
#include <SetupAPI.h>
#include <cfgmgr32.h >
#include <initguid.h>
#include <usbiodef.h>
#include <usbioctl.h>
#include <combaseapi.h>
#include <winioctl.h>
#include <regex>

int UsbQuery::getUSBCount() {
    //error is thrown from the below code
    HDEVINFO usbInfo = SetupDiGetClassDevs(&GUID_CLASS_USB_DEVICE, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); 

    SP_DEVINFO_DATA deviceData;
    deviceData.cbSize = sizeof(SP_DEVINFO_DATA);

    int i = 0;
    while (SetupDiEnumDeviceInfo(usbDeviceInfoSet, i, &deviceData))
    {
        i++;
    }
    return i;
}

C#

    [DllImport(_dllImportPath, CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetUSBCount", CharSet = CharSet.Auto)]
    public static extern int GetUSBCount();

什么有效

我实现此功能的一种方法是在部署软件的 PC 上安装 Visual Studio。然而,这显然不是最终的解决方案,但让我知道有一种方法可以解决它。如果我使用以下软件包(没有其他软件包)安装 Visual Studio Community,则该软件运行时不会出现错误。 enter image description here

此软件包还安装以下 SDK: enter image description here 当我卸载这个sdk包时,部署的软件找不到setupAPI.h。让我猜测随该软件包安装的某些内容包含查找 SetupApi 所需的链接。

我已经尝试过了

  • 获取我可以在开发 PC 上找到的各种“setupApi.dll”或“setupapi.lib”文件,并以各种方式直接将它们包含在我的解决方案中,并将它们复制到已部署的 PC。我注意到 System32 文件夹中有一些带有“setupApi.dll”的文件。 不起作用
  • 安装大量 WindowSDK 和 WDK(计算机上没有 Visual Studio),不起作用。
  • 从上图中找到SDK。我找不到特定 .3233 安装程序的安装程序。我认为这意味着它特定于 Visual Studio?
  • 尝试将包
    dotnet add package Microsoft.Windows.SDK.CPP.arm --version 10.0.22621.3233
    包含在适用的 .NET 项目中。这会导致 TargetPlatform 的版本问题,并且是一个我认为不值得解决的兔子洞。

该软件并没有真正部署在很多地方,并且已经有一些针对其安装的其他方面的黑客解决方案。因此,如果我可以将文件夹复制到某处,并设置一些 hacky 链接来调用它,那也可以。最主要的是我显然无法在每台计算机上安装 Visual Studio。 如果有一种方法可以将我的 C++ 项目 DLL 捆绑得很大并包含所有要求,那么这就是一个可行的解决方案。但我一直没能弄清楚如何编译 C++ 项目 DLL 以将所有内容捆绑在一起。
如果我可以将所需的 *.h、*.lib 或 *.dll 文件复制为项目的“嵌入式资源”,这是可以接受的。

部署是通过 UWP 部署完成的。我们利用云构建脚本来实际构建和存储安装文件。但是,当我们设置一台新电脑时,我们需要许多驱动程序和自定义安装,才能使一切正常运行。自动化安装的需求并不那么重要,因为每个部署都需要适当的手动参与。

c++ .net visual-studio dll devops
1个回答
0
投票

AhmedAEK 的评论带来了解决方案。 可以帮助其他遇到类似问题的人的主要问题是确保将 Visual Studio 中的 VC C++ 项目编译为“发布”模式,否则它们将无法工作。

© www.soinside.com 2019 - 2024. All rights reserved.