SetupAPI - SetupDiGetDeviceRegistryProperty заменить?

Мне нужно использовать некоторые функции SetupAPI в расширении Firefox. Мне нужно получить понятное имя устройства. Я подумал, что это может быть сделано SetupDiGetClassDevs, SetupDiEnumDeviceInfo, SetupDiGetDeviceRegistryProperty а также SetupDiDestroyDeviceInfoList,

НО! Я импортировал setupapi.dll и объявил три функции - без проблем. Потом я узнал, что SetupDiGetDeviceRegistryProperty просто отсутствует в DLL и может быть только статически связан с setupapi.lib, Есть ли способ, которым я мог бы заменить эту функцию?

Я не могу использовать WMI.

2 ответа

Решение

Эта функция действительно есть в SetupAPI.DLL, как я подтвердил, используя Dependency Walker. Просто он принимает символ-указатель (строку), у него должно быть два варианта - один для ANSI (A), один для Unicode (W).

  • SetupDiGetDeviceRegistryPropertyA
  • SetupDiGetDeviceRegistryPropertyW

Это происходит с любой функцией Windows API - если функция принимает одну или несколько символьных строк в качестве аргументов, у нее будет два варианта.

Я вижу, вы, вероятно, используете GetProcAddress найти его. Следовательно, вам нужно передать ему реальное имя (а не макрос). Следующий получает широкий вариант этой функции.

GetProcAddress(handleOfDLL, "SetupDiGetDeviceRegistryPropertyW"); // Wide

Вы правы, нет экспорта с таким точным именем. Это имя фактически определено в заголовке SetupApi, как и большинство функций в API Windows, которые имеют варианты Unicode и ANSI.

Из SetupApi.h:

#ifdef UNICODE
#define SetupDiGetDeviceRegistryProperty SetupDiGetDeviceRegistryPropertyW
#else
#define SetupDiGetDeviceRegistryProperty SetupDiGetDeviceRegistryPropertyA
#endif

Функция находится в таблице экспорта как SetupDiGetDeviceRegistryPropertyW (порядковый номер: 373) или SetupDiGetDeviceRegistryPropertyA (порядковый номер: 372)

Я нашел тех, кто использует dumpbin /exports setupapi.dll,

Другие вопросы по тегам