すみません、先の質問で解決していないのに解決のチェックをしてしまいました。
改めて記載しますので、宜しくお願いします。
やりたいことは、マルチモニタへの対応ですが、以下のエラーが発生します。
●WindowsXP VC++6 MFC ダイアログベース
●エラー内容
コンパイル中...
StdAfx.cpp
コンパイル中...
ClientSocket.cpp
DIDS.cpp
DIDSDlg.cpp
D:\〜\DIDSDlg.cpp(1530) : error C2065: 'HMONITOR' : 定義されていない識別子です。
D:\〜\DIDSDlg.cpp(1530) : error C2146: 構文エラー : ';' が、識別子 'MonitorHandle' の前に必要です。
D:\〜\DIDSDlg.cpp(1530) : error C2065: 'MonitorHandle' : 定義されていない識別子です。
D:\〜\DIDSDlg.cpp(1531) : error C2065: 'MONITORINFO' : 定義されていない識別子です。
D:\〜\DIDSDlg.cpp(1531) : error C2146: 構文エラー : ';' が、識別子 'MonitorInfo' の前に必要です。
D:\〜\DIDSDlg.cpp(1531) : error C2065: 'MonitorInfo' : 定義されていない識別子です。
D:\〜\DIDSDlg.cpp(1586) : error C2039: 'MonitorFromPoint' : '`global namespace'' のメンバではありません。
D:\〜\DIDSDlg.cpp(1586) : error C2065: 'MonitorFromPoint' : 定義されていない識別子です。
D:\〜\DIDSDlg.cpp(1586) : error C2065: 'MONITOR_DEFAULTTOPRIMARY' : 定義されていない識別子です。
D:\〜\DIDSDlg.cpp(1587) : error C2228: '.cbSize' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1588) : error C2039: 'GetMonitorInfo' : '`global namespace'' のメンバではありません。
D:\〜\DIDSDlg.cpp(1588) : error C2065: 'GetMonitorInfo' : 定義されていない識別子です。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.rcWork' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.left' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.rcWork' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.top' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.rcWork' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.right' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.rcWork' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.left' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.rcWork' : 左側がクラス、構造体、共用体ではありません。
D:\〜\DIDSDlg.cpp(1594) : error C2228: '.bottom' : 左側がクラス、構造体、共用体ではありません。
Setting.cpp
コードを生成中...
cl.exe の実行エラー
●StdAfx.cpp
// stdafx.cpp : 標準インクルードファイルを含むソース ファイル
// DIDS.pch : 生成されるプリコンパイル済ヘッダー
// stdafx.obj : 生成されるプリコンパイル済タイプ情報
#include "stdafx.h"
// add start
#ifndef STDAFX_CPP
#define STDAFX_CPP
#define COMPILE_MULTIMON_STUBS
#include <windows.h>
#include <multimon.h>
#endif
// add end
●DIDSDlg.cpp
BOOL CDIDSDlg::OnInitDialog()
{
// add start
blRet = SetDidsDlg();
// add end
}
BOOL CDIDSDlg::SetDidsDlg()
{
CRect crectDialog;
RECT rectDesktop;
HMONITOR MonitorHandle;
MONITORINFO MonitorInfo;
// ダイアログサイズ
GetWindowRect(&crectDialog);
// 画面(プライマリ)サイズ:画面下タスクバーを除いたサイズ
SystemParametersInfo(SPI_GETWORKAREA, 0, &rectDesktop, 0);
// 画面(セカンダリ)サイズ
POINT Point = {(long)rectDesktop.right, (long)rectDesktop.top};
MonitorHandle = ::MonitorFromPoint(Point, MONITOR_DEFAULTTOPRIMARY);
MonitorInfo.cbSize = sizeof(MonitorInfo);
::GetMonitorInfo(MonitorHandle, &MonitorInfo);
// ダイアログの表示位置
SetWindowPos(&wndTop, MonitorInfo.rcWork.left,MonitorInfo.rcWork.top, MonitorInfo.rcWork.right -MonitorInfo.rcWork.left,MonitorInfo.rcWork.bottom, SWP_SHOWWINDOW);
return(TRUE);
}
ようするに「定義されているファイルがインクルードされていない」
というエラーメッセージです。
http://www.sutosoft.com/room/archives/000318.html
を見る限りでは
StdAfx.cppには
#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
DIDSDlg.cppには
#include <multimon.h>
でいけそうな気がするのですが…。
コンパイルエラーをなくすためには
#include <multimon.h>
が必要。
さらにリンクエラーをなくすには1つのソースでのみ
#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
のセットが必要と記述がありますので。
以下の内容でリビルドしましたが、エラーが発生しました。
すみませんが、宜しくお願いいたします。
●StdAfx.cpp
// stdafx.cpp : 標準インクルードファイルを含むソース ファイル
// DIDS.pch : 生成されるプリコンパイル済ヘッダー
// stdafx.obj : 生成されるプリコンパイル済タイプ情報
#include "stdafx.h"
// add start
#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
// add end
●DIDSDlg.cpp
// DIDSDlg.cpp : インプリメンテーション ファイル
//
#include "stdafx.h"
#include "DIDS.h"
#include "DIDSDlg.h"
#include "Setting.h"
// add start
#include <multimon.h>
// add end
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
●エラー
プロジェクト 'DIDS - Win32 Debug' 用の中間ファイルおよび出力ファイルを削除しています。
--------------------構成: DIDS - Win32 Debug--------------------
リソースをコンパイル中...
コンパイル中...
StdAfx.cpp
コンパイル中...
ClientSocket.cpp
DIDS.cpp
DIDSDlg.cpp
c:\program files\microsoft visual studio\vc98\include\multimon.h(73) : error C2065: 'HMONITOR' : 定義されていない識別子です。
c:\program files\microsoft visual studio\vc98\include\multimon.h(73) : error C2275: 'HDC' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
c:\program files\microsoft visual studio\vc98\include\windef.h(239) : 'HDC' の宣言を確認してください。
c:\program files\microsoft visual studio\vc98\include\multimon.h(73) : error C2275: 'LPRECT' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
c:\program files\microsoft visual studio\vc98\include\windef.h(292) : 'LPRECT' の宣言を確認してください。
c:\program files\microsoft visual studio\vc98\include\multimon.h(73) : error C2275: 'LPARAM' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
c:\program files\microsoft visual studio\vc98\include\windef.h(171) : 'LPARAM' の宣言を確認してください。
c:\program files\microsoft visual studio\vc98\include\multimon.h(73) : error C2165: 'left-side modifier' : データへのポインタは変更できません。
c:\program files\microsoft visual studio\vc98\include\multimon.h(73) : error C2071: 'MONITORENUMPROC' : 記憶クラスは不正です。
c:\program files\microsoft visual studio\vc98\include\multimon.h(340) : error C2143: 構文エラー : ';' が '__stdcall' の前に必要です。
c:\program files\microsoft visual studio\vc98\include\multimon.h(341) : error C2143: 構文エラー : ';' が '__stdcall' の前に必要です。
c:\program files\microsoft visual studio\vc98\include\multimon.h(342) : error C2143: 構文エラー : ';' が '__stdcall' の前に必要です。
c:\program files\microsoft visual studio\vc98\include\multimon.h(343) : error C2275: 'LPMONITORINFO' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
c:\program files\microsoft visual studio\vc98\include\multimon.h(54) : 'LPMONITORINFO' の宣言を確認してください。
c:\program files\microsoft visual studio\vc98\include\multimon.h(343) : warning C4229: 旧形式が使用されています : データの修飾子は無視されます。
c:\program files\microsoft visual studio\vc98\include\multimon.h(343) : error C2078: 初期化子の数が多すぎます。
c:\program files\microsoft visual studio\vc98\include\multimon.h(343) : error C2275: 'LPMONITORINFO' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
c:\program files\microsoft visual studio\vc98\include\multimon.h(54) : 'LPMONITORINFO' の宣言を確認してください。
D:\〜\DIDSDlg.cpp(1531) : error C2146: 構文エラー : ';' が、識別子 'MonitorHandle' の前に必要です。
D:\〜\DIDSDlg.cpp(1531) : error C2065: 'MonitorHandle' : 定義されていない識別子です。
Setting.cpp
コードを生成中...
cl.exe の実行エラー
DIDS.exe - エラー 14、警告 1
どこかのサイトの記事を読んで解決したのですが・・・
私は、User32.dll をLoadLibraryして、GetProcAddress
で該当のAPIを取得し、使っています。
根本的なコンパイル上の解決方法ではありませんが、
確実に動作させれる方法です。
お試し下さい。
※ マルチディスプレイの画面コピープログラムを作成し
ましたので、その際の解決方法です。
以上。
VC++6 のデフォルト設定なら HMONITOR はコンパイルエラーになるのが仕様
HMONITOR のヘルプを MSDN online のほうで検索してみよう
http://msdn2.microsoft.com/en-us/library/aa383751.aspx
などが見つかるわけだけど、これを見ると擬似コード
if(WINVER >= 0x0500) typedef HANDLE HMONITOR;
が提供されている。つまり WINVER の値が小さいとコンパイルできないことがわかる。
つまるところ
・ VC++6 のデフォルト設定では #define WINVER 0x0400 となってる
・ところが HMONITOR を使うには #define WINVER 0x0500 でなければならない
・ところが VC++6 の標準ヘッダは #define WINVER 0x0500 時の動作を保証しない
という3点のコンボが成立するため結構これを解決するのは面倒なんだ
というわけで解決策はいくつか考えられるんだけど、一番簡単な奴だけ提示しとく
プロジェクトの設定→C/C++→プリプロセッサ→定義に
WINVER=0x0500
を追加して、再コンパイルする
と、警告は出るけど何とかなるんぢゃないかな。
動作しなくても知らないけどな。
> HMONITOR のヘルプを MSDN online のほうで検索してみよう
> http://msdn2.microsoft.com/en-us/library/aa383751.aspx
> などが見つかるわけだけど、これを見ると擬似コード
> if(WINVER >= 0x0500) typedef HANDLE HMONITOR;
> が提供されている。つまり WINVER の値が小さいとコンパイルできないことがわかる。
multimon.hには、これを補償するように、WINVER < 0x0500 の時、HMONITORを
定義するコードが入っていますので、このあたりは問題にならないはず。
私の所で、VC++6 SP6、すべてデフォルト設定のMFCダイアログアプリプロジェクトを作り、
Stdafx.cppでアプリクラス::InitInstance()でHMONITOR型変数を宣言してみたり、
GetSystemMetrics (実際はxGetSystemMetrics)のアドレスを取ってみたりしたのですが、
コンパイル、リンク共に通りました。
エラーメッセージを見るに、その他にもいろいろと宣言、定義がなされていない様子。
DIDSDlg.cppにおいて、"stdafx.h"のインクルードより先に<multimon.h>を
インクルードしていることも疑いましたが、
> ●DIDSDlg.cpp
> // DIDSDlg.cpp : インプリメンテーション ファイル
> //
> #include "stdafx.h"
> #include "DIDS.h"
> #include "DIDSDlg.h"
> #include "Setting.h"
> // add start
> #include <multimon.h>
> // add end
そんなことはないようですね。
うーむ、何だろ。
あぅ。推敲不足。
> Stdafx.cppでアプリクラス::InitInstance()でHMONITOR型変数を宣言してみたり、
「Stdafx.cppで」が余計です。飛ばして読んで下さい。
書き込みありがとうございます。
●テスト用プロジェクト(MFC、ダイアログベース)で行った時は、こちらも
特に問題ありませんでした。
// TestDlg.cpp : インプリメンテーション ファイル
//
#include "stdafx.h"
#include "Test.h"
#include "TestDlg.h"
#include "Dialog1.h"
// start----
#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
// end----
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTestDlg メッセージ ハンドラ
BOOL CTestDlg::OnInitDialog()
{
// start----
CString strValue;
CRect crectDialog;
RECT rectDesktop;
long x, y;
HMONITOR MonitorHandle;
MONITORINFO MonitorInfo;
GetWindowRect(&crectDialog); // ダイアログサイズ
SystemParametersInfo(SPI_GETWORKAREA, 0, &rectDesktop, 0); // 画面(プライマリ)サイズ:画面下タスクバーを除いたサイズ
x = rectDesktop.right;
y = rectDesktop.top;
POINT Point = {x, y};
MonitorHandle = ::MonitorFromPoint(Point, MONITOR_DEFAULTTOPRIMARY);
MonitorInfo.cbSize = sizeof(MonitorInfo);
::GetMonitorInfo(MonitorHandle, &MonitorInfo);
SetWindowPos(&wndTop, MonitorInfo.rcWork.left, MonitorInfo.rcWork.top, MonitorInfo.rcWork.right - MonitorInfo.rcWork.left, MonitorInfo.rcWork.bottom, SWP_SHOWWINDOW);
// end----
return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}
ツイート | ![]() |