pragma comment
или библиотеку в компоновщик (я попробовал оба решения, и оба работают). Пример здесьПример кода: С++
#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;
}
С#
[DllImport(_dllImportPath, CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetUSBCount", CharSet = CharSet.Auto)]
public static extern int GetUSBCount();
Единственный способ заставить это работать — установить Visual Studio на ПК, на котором развернуто программное обеспечение. Однако это, очевидно, не окончательное решение, но оно привело меня на путь осознания того, что есть способ исправить это. Если я установлю сообщество Visual Studio со следующим пакетом (и ничего больше), программное обеспечение заработает без ошибок.
Этот пакет также устанавливает следующий SDK: Когда я удаляю этот пакет SDK, развернутое программное обеспечение не может найти setupAPI.h. Это наводит меня на мысль, что что-то, установленное вместе с этим пакетом, включает в себя ссылку, необходимую для поиска SetupApi.
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. Мы используем сценарий облачной сборки для создания и хранения установочных файлов. Но когда мы настраиваем новый компьютер, нам нужно множество драйверов и выборочных установок, чтобы все работало. Необходимость автоматической установки не так уж важна, поскольку каждое развертывание уже требует приличного ручного вмешательства.
да, у меня также установлены все дистрибутивы vc C++ на ПК. Я думаю, вопрос в том, какой dll не хватает в ссылках setupapi, я знаю, что это более общий вопрос. Но я не знаю, какая DLL устанавливается через Visual Studio, которой нет. Я использую PInvoke для вызова своей DLL, но я не знаю, какую DLL вызывать, которая заключена в пример кода SetupDiGetClassDevs
в вопросе.
Вы компилируете в режиме отладки или выпуска? Распространяемые файлы VС++ представляют собой только двоичные файлы.
Локально: отладка или выпуск. Для развернутого программного обеспечения — Release.
Загрузите средство обхода зависимостей или, если есть рука, современную версию и посмотрите, какая dll отсутствует на второй машине.
@AhmedAEK, ты ведешь меня по правильному пути, и я думаю, что я это исправил! В качестве временной меры я скомпилировал C++ dll локально и включил его в качестве встроенного ресурса. Наш сервер сборки необходимо переделать для работы с проектом C++. Однако я не обращал внимания и компилировал одноразовую версию в Debug, а затем передавал DLL в используемый проект. Итак, как многие из нас испытывают. Проблема заключалась в полной ошибке разработчика... Наверное, я также не знал, что установки VC C++ были только Release.
Рады узнать, что ваша проблема решена! Пожалуйста, рассмотрите возможность преобразования комментария в ответ.
Поскольку комментарий АхмедАЕК привел к решению. Основная проблема, которая может помочь кому-либо еще с подобной проблемой, — это обязательно скомпилировать проекты VC C++ в Visual Studio в режиме «Выпуск», иначе они не будут работать.
Вы серьезно на неправильном пути в этом вопросе. Setupapi.h ссылается только на библиотеки DLL операционной системы, доступные на любом компьютере с Windows. Гораздо более вероятно, что вашему модулю C++ нужна DLL. Найдите для него установщик здесь. Или разверните библиотеки DLL вместе с вашей программой. Или создайте модуль C++, чтобы они ему не требовались, что возможно в сценарии pinvoke. Проект > Свойства > C/C++ > Генерация кода > «Библиотека времени выполнения» = /MT. Дважды проверьте, запустив dumpbin.exe /imports в dll.