- ベストアンサー
C2065: 'EnumDisplayDevices' : 定義されていない識別子です。
初歩的な質問で申し訳ないのですが、 EnumDisplayDevicesを使用したいのですが、タイトルのエラーになってしまいます。 一応、ヘルプを見て、winuser.hは、インクルードしています。 #include <winuser.h> 何がいけないのでしょうか? 開発環境は、VC6.0SP6です。
- みんなの回答 (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; }
その他の回答 (4)
- sakusaker7
- ベストアンサー率62% (800/1280)
>Windows SDKは、VisualStudioの付属のものです。 #3の方の回答にもあるように、問題のAPIはWindows2000以降実装されたものですから VC6が発売された時期を考えると、コンパイラ付属のSDKではヘッダファイルに記述がないでしょうし インポートライブラリにもないでしょう。 少なくとも該当のAPIの情報が収録されているSDKをインストールしないといけません。 >>次に、WINVERというシンボルは定義されてますか? >していません。 新し目のSDKを入れても、このシンボルに適切な値が設定されていないと 新しいAPIを使おうとすると警告やエラーになります。
- Yanch
- ベストアンサー率50% (114/225)
OSは何をお使いでしょうか? EnumDisplayDevices()は、要求環境Windows2000以降とありますので、 Windows2000以前のOSではコンパイルも実行も出来ません。 後、古いコンパイラの場合もEnumDisplayDevices()は使用できないみたいです。 どのバージョンのVCからEnumDisplayDevices()を使える様になったのかは、 わかりません。 もし、Windows2000以降のOSを使っていて、VCが古い事が理由でコンパイル出来ない 場合は、user32.dllにEnumDisplayDevices()が含まれている様子ですから、 自前で呼び出せる様に定義するとよいかもしれません。
補足
>自前で呼び出せる様に定義するとよいかもしれません。 ロードは、こんな感じですか? 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)
>開発環境は、VC6.0SP6です。 ずいぶんな年代物をお使いですがWindows SDKはコンパイラ付属のものではなく 新しいものを使ってますか?(最新のは無理だったと思いますが) 次に、WINVERというシンボルは定義されてますか? されていた場合、その値はどうなっていますか。
補足
>ずいぶんな年代物をお使いですがWindows SDKはコンパイラ付属のものではなく新しいものを使ってますか? 勉強用にもらったものなので…確かに古いですよね。 Windows SDKは、VisualStudioの付属のものです。 >次に、WINVERというシンボルは定義されてますか? していません。
- asuncion
- ベストアンサー率33% (2127/6289)
そのエラーが出るあたりのソースコードを 手で書き写すのではなくコピー&ペーストして 見せていただけますか?
補足
こんな感じです。 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);
お礼
machongolaさん、ありがとうございます。 教えて頂いた、手動で動かす参考例でコンパイルエラーせずに、 情報を取得できるようになりました。 とりあえず、ほぼコピペで使っていて、意味はこれから勉強します。 ありがとうございました。やっと先に進めます。