2016-05-24 25 views
1

Firefoxの拡張機能でSetupAPI関数を使用する必要があります。私はデバイスのフレンドリーな名前を取得する必要があります。私はそれがSetupDiGetClassDevs,SetupDiEnumDeviceInfo,SetupDiGetDeviceRegistryPropertyおよびSetupDiDestroyDeviceInfoListによって完了できると考えました。SetupAPI - SetupDiGetDeviceRegistryPropertyの代わりに使用しますか?

BUT! setupapi.dllをインポートし、3つの関数を宣言しました。問題はありません。その後、私はSetupDiGetDeviceRegistryPropertyが単にDLLにないことを知り、静的にしかsetupapi.libとリンクできませんでした。この機能に代わる方法はありますか?

WMIは使用できません。

+0

あなたはそうです、その正確な名前のエクスポートはありません。その名前は実際にSetupApiヘッダーに定義されています.Windows APIのUnicodeとANSIのバリアントを持つほとんどの関数と同様です。この関数は、 'SetupDiGetDeviceRegistryPropertyW'(序数:373)または' SetupDiGetDeviceRegistryPropertyA'(序数:372)としてエクスポートテーブルにあります。 – theB

+0

それがそれを解決しました。私はそれに関する不足しているドキュメントについてマイクロソフトに伝えました。ありがとう。 – Kobrar

+0

私は私のコメントを本当の答えに変えました。 – theB

答えて

1

この機能は、Dependency Walkerの使用を確認したので、実際はSetupAPI.DLLにあります。それは文字ポインタ(文字列)を取ります。ANSI(A)用とUnicode(W)の2種類があります。

  • SetupDiGetDeviceRegistryPropertyA
  • SetupDiGetDeviceRegistryPropertyW

これは、任意のWindows API関数である - 関数は、引数として文字列の一つ以上を要した場合、それは二つの変種を持っているでしょう。

おそらくGetProcAddressを使用していることがわかります。したがって、実際の名前(マクロではありません)を渡す必要があります。次に、この関数のワイドバリアントを取得します。

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

GetProcAddressを使用する必要があるこのような場合は、手動で入力するのではなく、文字列化マクロを使用して関数名文字列を生成するのが好きです。そうすれば、オートコンプリートとタイプミスに対する保護だけでなく、UNICODEがどのように定義されているかに応じて正しいA/W変種も得られます。 _CRT_STRINGIZEのようなものは、CRTを使用している場合や、自分のロールを使用できる場合には一般に利用可能です。 –

1

あなたはそうです、その正確な名前のエクスポートはありません。その名前は実際にはSetupApiヘッダーで定義されています.Windows APIのほとんどの関数はUnicode & ANSIバリアントです。 SetupApi.hから

:私はdumpbin /exports setupapi.dllを使用して、それらを発見した

(::373序)またはSetupDiGetDeviceRegistryPropertyA(372序)

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

機能がSetupDiGetDeviceRegistryPropertyWとしてエクスポートテーブルです。

関連する問題