私はWindows7Ultimate32ビットでDevC++を使用しており、プログラムにwindows.hとpsapi.hを含めています。GetProcessIdとDebugActiveProcessStopを除いて、これまで使用したすべてのWindowsAPIが機能しています。コンパイラは、どちらの場合も、指定された関数が宣言されていないことを返します。ただし、winbase.hを見ると、GetProcessIdが宣言されていることがはっきりとわかります。関数の上にマウスを置いても、構造に関する情報が表示されます。では、なぜコンパイラはどちらの関数も認識できないように見えるのでしょうか。
2 に答える
Win32 APIヘッダーを使用する場合は、対象のオペレーティングシステムのバージョンを指定する必要があります。これはMSDNライブラリに記載されています。
現在、NTDDI_VERSIONを定義することによってこれを行うことになっています。GetProcessIdのドキュメントを確認すると、Windows XP SP1が必要であることがわかります。そのため、ターゲットオペレーティングシステムのバージョンとして少なくともNTDDI_WINXPSP1を指定する必要があります。実際、SP1はサポートされなくなったため、おそらくSP2を使用したほうがよいでしょう。
#define NTDDI_VERSION 0x05010200
過去に、NTDDI_VERSIONの定義が常に期待どおりに機能するとは限らないことを発見しましたが、うまくいけば、ほとんどのグリッチは今までに解決されています。動作しない場合は、代わりに古いマクロ_WIN32_WINNTを使用してみてください。これは、上記のリンクにも記載されています。この場合、次のようにします。
#define _WIN32_WINNT 0x0502
後でVistaまたはWindows7で導入された関数を使用する必要がある場合は、NTDDI_VERSIONまたは_WIN32_WINNTの値を適切に変更してください。各関数のMSDNライブラリのドキュメントには、それが導入されたオペレーティングシステムのバージョンが記載されています。
この問題は、WindowsAPIでコーディングしているときに発生することがあります。関数がヘッダーファイルにあることがわかりますが、何らかの理由で、コンパイラが同意しません。この問題に遭遇したら、ヘッダーファイルで関数を見つけ、その周りのプリプロセッサディレクティブを探します。その関数を使用するには、何かを定義する必要があるかもしれません。
この場合、問題が発生している関数について私が見つけたものは次のとおりです。
#if (_WIN32_WINNT >= 0x0501)
WINBASEAPI DWORD WINAPI GetProcessId(HANDLE);
#endif
と
#if (_WIN32_WINNT >= 0x0501)
WINBASEAPI BOOL WINAPI DebugActiveProcessStop(DWORD);
#endif
したがって、Windowsヘッダーをインクルードするメインコードファイルで、Windowsヘッダーをインクルードする前にこの定義を配置します。
#define _WIN32_WINNT 0x0501
これで問題が解決するはずです。頑張ってください^_^