SetupAPI - SetupDiGetDeviceRegistryProperty 替代品?

SetupAPI - SetupDiGetDeviceRegistryProperty substitute?

我需要在 firefox 扩展中使用一些 SetupAPI 函数。我需要检索设备的友好名称。我认为可以通过 SetupDiGetClassDevsSetupDiEnumDeviceInfoSetupDiGetDeviceRegistryPropertySetupDiDestroyDeviceInfoList.

来完成

但是!我导入了 setupapi.dll 并声明了其中三个函数 - 没问题。然后我发现 SetupDiGetDeviceRegistryProperty 根本不在 DLL 中,只能与 setupapi.lib 静态链接。有什么方法可以替代这个功能吗?

我无法使用 WMI。

你是对的,不存在具有该确切名称的导出。该名称实际上是在 SetupApi header 中定义的,就像 Windows API 中的大多数具有 Unicode 和 ANSI 变体的函数一样。

来自SetupApi.h:

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

函数在导出中 table 作为 SetupDiGetDeviceRegistryPropertyW(序号:373)或 SetupDiGetDeviceRegistryPropertyA(序号:372)

我发现那些使用 dumpbin /exports setupapi.dll.

这个函数确实在 SetupAPI.DLL 中,正如我使用 Dependency Walker 确认的那样。只是,它需要一个字符指针(字符串),它必须有两种变体 - 一种用于 ANSI (A),一种用于 Unicode (W).

  • SetupDiGetDeviceRegistryPropertyA
  • SetupDiGetDeviceRegistryPropertyW

它适用于任何 Windows API 函数 - 如果函数将一个或多个字符串作为参数,它将有两个变体。

我看到你可能正在使用 GetProcAddress 来定位它。因此,您需要将真实姓名(不是宏)传递给它。以下获取此函数的广泛变体。

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