Как получить USB C++ SetupApi.h на компьютере для установки приложения .NET для использованияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как получить USB C++ SetupApi.h на компьютере для установки приложения .NET для использования

Сообщение Anonymous »

История:
  • у меня есть приложение .NET8 WPF, требующее подключения к различным последовательным USB-устройствам. Устанавливается только в Windows.
  • Хотел получить дескрипторы USB-устройств для получения дополнительной информации при подключении. Подобно USB Tree View, который был основан на USBView
  • чтобы получить эти дескрипторы, я создал проект C++, который компилируется в DLL, а затем импортируется в отдельный проект .NET.< /li>
    Чтобы это заработало, использовались следующие ресурсы:
  • SO-вопрос, ссылка на блог, моды для кода из блога
    < li>Все это работает нормально, когда я собираю локально
  • Важно то, что код C++ использует ссылку на SetupApi.h
Конкретные проблемы
  • Во время разработки я получил ошибку (0x8007007E) «Не удалось найти конкретный модуль», связанную с файлом SetupApi.h библиотека. Это привело к решению добавить комментарий прагмы или добавить библиотеку в компоновщик (я попробовал оба решения, и оба работают). Пример здесь
  • Как только все эти проблемы с компоновкой/библиотекой были решены, пакет C++ был собран, создана DLL, импортирована в мою программу на C# .NET, и все заработало локально.
  • Однако, когда я собрал наше программное обеспечение и развернул его на машине без среды разработки (т. е. с Visual Studio), я теперь получаю то же самое (0x8007007E) для того же файла SetupApi.h. Это означает, что на ПК не установлены необходимые библиотеки.
Пример кода:
C++

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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();
Что сработало
Единственный способ заставить это работать — установить Visual Studio на ПК, на котором развернуто программное обеспечение. Однако это, очевидно, не окончательное решение, но оно привело меня на путь осознания того, что есть способ исправить это. Если я устанавливаю сообщество Visual Studio со следующим пакетом (и ничем другим), программное обеспечение работает без ошибок.
Изображение

Этот пакет также устанавливает следующий SDK:
[img]https://i.sstatic.net /F0he3RvV.png[/img]
Когда я удаляю этот пакет SDK, развернутое программное обеспечение не может найти файл setupAPI.h. Это заставляет меня предположить, что что-то, установленное вместе с этим пакетом, содержит ссылку, необходимую для поиска SetupApi.
Что я пробовал
  • беру различные файлы «setupApi.dll» или «setupapi.lib», которые я могу найти на своем компьютере для разработчиков, напрямую включаю их в свое решение различными способами и копирую их на развернутый компьютер. Как я заметил, в папке 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, и я не думаю, что это кроличья нора, которую стоит решать.
Программное обеспечение на самом деле не развернуто во многих местах, и уже есть несколько хакерских решений для других аспектов его установки. Так что, если я могу скопировать куда-нибудь папку и установить какую-нибудь хакерскую ссылку для ее вызова, это тоже сработает. Главное, что я, очевидно, не могу установить Visual Studio на каждый компьютер.
Если есть способ объединить DLL моего проекта C++ так, чтобы она была большой и включала все требования, это жизнеспособное решение. Но мне не удалось выяснить, как скомпилировать DLL проекта C++, чтобы объединить все воедино.

Если я смогу скопировать необходимые файлы *.h, *.lib или *.dll как " Встроенный ресурс» проекта, что является приемлемым.
Развертывание выполняется через развертывание UWP. Мы используем сценарий облачной сборки для создания и хранения установочных файлов. Но когда мы настраиваем новый компьютер, нам нужно множество драйверов и выборочных установок, чтобы все работало. Необходимость автоматической установки не так уж важна, поскольку каждое развертывание уже требует приличного вмешательства вручную.

Подробнее здесь: https://stackoverflow.com/questions/786 ... stallation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»