タイムマシーンがあったら、過去と未来どちらに行く?

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

A 回答 (5件)

 こんにちは。



 私が普段使用しているのがVC60(SP5だったっけ?)です。PlatformSDKSP1を入れているので、普通に使えました。
 以下をダウンロードした方が良いと思います。
 http://www.microsoft.com/downloads/details.aspx? …


 手動で動かすなら以下参考程度に。

#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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/12 20:52

>Windows SDKは、VisualStudioの付属のものです。


#3の方の回答にもあるように、問題のAPIはWindows2000以降実装されたものですから
VC6が発売された時期を考えると、コンパイラ付属のSDKではヘッダファイルに記述がないでしょうし
インポートライブラリにもないでしょう。
少なくとも該当のAPIの情報が収録されているSDKをインストールしないといけません。

>>次に、WINVERというシンボルは定義されてますか?
>していません。

新し目のSDKを入れても、このシンボルに適切な値が設定されていないと
新しいAPIを使おうとすると警告やエラーになります。
    • good
    • 0

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をどのように定義したら良いかぜんぜんわかりません。
たぶん、このあたりの勉強不足でしょうけど…。

補足日時:2009/01/12 11:51
    • good
    • 0

>開発環境は、VC6.0SP6です。



ずいぶんな年代物をお使いですがWindows SDKはコンパイラ付属のものではなく
新しいものを使ってますか?(最新のは無理だったと思いますが)

次に、WINVERというシンボルは定義されてますか?
されていた場合、その値はどうなっていますか。

この回答への補足

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

>次に、WINVERというシンボルは定義されてますか?
していません。

補足日時:2009/01/11 16:06
    • good
    • 0

そのエラーが出るあたりのソースコードを


手で書き写すのではなくコピー&ペーストして
見せていただけますか?

この回答への補足

こんな感じです。

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);

補足日時:2009/01/11 15:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報