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
,