2

このコードを 例として、サービスを作成しました。そして、コマンドラインパラメータを操作するようにメイン関数にいくつかの変更を加え、削除しました

#define UNICODE
#define WINVER 0x502 

「MINGW」を使用しています。

次のエラーが発生しています。

usb_detect.c: In function 'ServiceMain':
usb_detect.c:123:16: error: unknown type name 'DEV_BROADCAST_DEVICEINTERFACE'
usb_detect.c:132:41: error: request for member 'dbcc_size' in something not a structure or union
usb_detect.c:132:61: error: 'DEV_BROADCAST_DEVICEINTERFACE' undeclared (first use in this function)
usb_detect.c:132:61: note: each undeclared identifier is reported only once for each function it appears in
usb_detect.c:133:41: error: request for member 'dbcc_devicetype' in something not a structure or union
usb_detect.c:133:60: error: 'DBT_DEVTYP_DEVICEINTERFACE' undeclared (first use in this function)
usb_detect.c:136:117: error: 'DEVICE_NOTIFY_SERVICE_HANDLE' undeclared (first use in this function)
usb_detect.c:136:148: error: 'DEVICE_NOTIFY_ALL_INTERFACE_CLASSES' undeclared (first use in this function)

unicodeとwinverのコメントを外してもエラーは発生しませんが、コマンドラインパラメーターが機能しません。dbt.hも含めました。

4

1 に答える 1

2

このDEV_BROADCAST_DEVICEINTERFACE構造は、Windows XP以降(およびこのコードが依存する他のAPIの一部)でのみサポートされます。そのバージョン以降のWindowsを対象としている場合を除き、Windowsヘッダーでは定義されません。

確実に定義するには、をインクルードする前Windows.hに、ヘッダーファイルの先頭でターゲットバージョンのWindowsを明示的に指定する必要があります。

典型的なパターンは次のようになります。

#include <WinSDKVer.h>
#define _WIN32_WINNT    _WIN32_WINNT_WINXP
#include <SDKDDKVer.h>

試したコードの元のバージョンには次の行があり、これを削除しました。

#define WINVER 0x502

これにより、ターゲットのWindowsバージョンがWindows Server 2003(Windows NT v5.2)に明示的に設定されます。これを削除すると、最小公分母に戻ることになります。これは、DEV_BROADCAST_DEVICEINTERFACE構造が定義されていないXPより前のバージョンのWindowsです。

UNICODEまた、定義を削除する理由も明確ではありません。2012年です。作成するアプリはすべてUnicodeをターゲットにする必要があります。それも定義したままにしておきます。

于 2012-05-18T11:39:44.110 に答える