• ベストアンサー

C2065: 'EnumDisplayDevices' : 定義されていない識別子です。

初歩的な質問で申し訳ないのですが、 EnumDisplayDevicesを使用したいのですが、タイトルのエラーになってしまいます。 一応、ヘルプを見て、winuser.hは、インクルードしています。 #include <winuser.h> 何がいけないのでしょうか? 開発環境は、VC6.0SP6です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

 こんにちは。  私が普段使用しているのがVC60(SP5だったっけ?)です。PlatformSDKSP1を入れているので、普通に使えました。  以下をダウンロードした方が良いと思います。  http://www.microsoft.com/downloads/details.aspx?familyid=D8EECD75-1FC4-49E5-BC66-9DA2B03D9B92&displaylang=en  手動で動かすなら以下参考程度に。 #include<windows.h> #include<stdio.h> #ifdef UNICODE LPCSTR PSZFUNNAME = "EnumDisplayDevicesW"; #else LPCSTR PSZFUNNAME = "EnumDisplayDevicesA"; #endif typedef BOOL(WINAPI* PFNENUMDISPLAYDRIVERS)(PVOID Unused, DWORD iDevNum, PDISPLAY_DEVICE lpDisplayDevice, DWORD dwFlags); int main(void) { HMODULE hModule = ::LoadLibrary( "user32.dll"); if(hModule == NULL) { ::MessageBox( NULL, "user32.dllが見つかりません", "エラー", MB_OK ); } PFNENUMDISPLAYDRIVERS pfnEnumDisplayDrivers = (PFNENUMDISPLAYDRIVERS)::GetProcAddress(hModule, PSZFUNNAME); if(pfnEnumDisplayDrivers == NULL) { ::MessageBox( NULL, "関数が見つかりません", "エラー", MB_OK ); } DISPLAY_DEVICE dispDevice = {sizeof(dispDevice)}; DWORD nDevNum = 0; pfnEnumDisplayDrivers(0, nDevNum, &dispDevice, 0); ::FreeLibrary(hModule); ::printf("%s\n", dispDevice.DeviceName); ::printf("%s\n", dispDevice.DeviceString); return 0; }

ymrs8888
質問者

お礼

machongolaさん、ありがとうございます。 教えて頂いた、手動で動かす参考例でコンパイルエラーせずに、 情報を取得できるようになりました。 とりあえず、ほぼコピペで使っていて、意味はこれから勉強します。 ありがとうございました。やっと先に進めます。

その他の回答 (4)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

>Windows SDKは、VisualStudioの付属のものです。 #3の方の回答にもあるように、問題のAPIはWindows2000以降実装されたものですから VC6が発売された時期を考えると、コンパイラ付属のSDKではヘッダファイルに記述がないでしょうし インポートライブラリにもないでしょう。 少なくとも該当のAPIの情報が収録されているSDKをインストールしないといけません。 >>次に、WINVERというシンボルは定義されてますか? >していません。 新し目のSDKを入れても、このシンボルに適切な値が設定されていないと 新しいAPIを使おうとすると警告やエラーになります。

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.3

OSは何をお使いでしょうか? EnumDisplayDevices()は、要求環境Windows2000以降とありますので、 Windows2000以前のOSではコンパイルも実行も出来ません。 後、古いコンパイラの場合もEnumDisplayDevices()は使用できないみたいです。 どのバージョンのVCからEnumDisplayDevices()を使える様になったのかは、 わかりません。 もし、Windows2000以降のOSを使っていて、VCが古い事が理由でコンパイル出来ない 場合は、user32.dllにEnumDisplayDevices()が含まれている様子ですから、 自前で呼び出せる様に定義するとよいかもしれません。

ymrs8888
質問者

補足

>自前で呼び出せる様に定義するとよいかもしれません。 ロードは、こんな感じですか? HMODULE hModule; hModule = LoadLibrary( "user32.dll" ); if( hModule == NULL )  {   MessageBox( NULL, "user32.dllが見つかりません", "エラー", MB_OK );  } その後のGetProcAddressの呼び出しがよくわかりません。 func = GetProcAddress( hModule, "EnumDisplayDevices" ); とした場合のfuncをどのように定義したら良いかぜんぜんわかりません。 たぶん、このあたりの勉強不足でしょうけど…。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>開発環境は、VC6.0SP6です。 ずいぶんな年代物をお使いですがWindows SDKはコンパイラ付属のものではなく 新しいものを使ってますか?(最新のは無理だったと思いますが) 次に、WINVERというシンボルは定義されてますか? されていた場合、その値はどうなっていますか。

ymrs8888
質問者

補足

>ずいぶんな年代物をお使いですがWindows SDKはコンパイラ付属のものではなく新しいものを使ってますか? 勉強用にもらったものなので…確かに古いですよね。 Windows SDKは、VisualStudioの付属のものです。 >次に、WINVERというシンボルは定義されてますか? していません。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

そのエラーが出るあたりのソースコードを 手で書き写すのではなくコピー&ペーストして 見せていただけますか?

ymrs8888
質問者

補足

こんな感じです。 CWinApp theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // MFC の初期化および初期化失敗時のエラーの出力 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 必要に応じてエラー コードを変更してください。 cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { // TODO: この位置にアプリケーションの動作を記述してください。 DISPLAY_DEVICE dispDevice; DWORD nDevNum=0; EnumDisplayDevices(0, nDevNum, &dispDevice, 0);

関連するQ&A