ContentsC++ Labo.>ex-0


C++Builder研究所

【ex-0:EnumChildWindow関数】


ウィンドウの子ウィンドウのハンドル一覧を取得しようと、
WindowsAPIのEnumChildWindows関数とEnumChildProcコールバック関数を使い、
以下の用にプログラムを組んでビルドをしました。
#include <windows.h>
#include <winuser.h>
#include <stdio.h>

BOOL CALLBACK EnumChildProc(HWND,long);

BOOL CALLBACK EnumChildProc(HWND hWnd,long lparam)
{
	char	lpText[256];

	GetWindowText(hWnd, lpText,256);
	printf("Handle=[%x] ControlText=[%s]\n", hWnd, lpText);
	return	TRUE;
}

int main(int argc, char* argv[])
{
	HWND	hWnd = FindWindow(NULL,"何かウィンドウタイトル");
	EnumChildWindows(hWnd, EnumChildProc,0);
	return 0;
}
ところが、以下の様なエラーが発生してビルドが出来ません。
・E2034 'int (__stdcall *)(void *, long)'型は'int (__stdcall *)()'型に変換できない
・E2034 パラメータ'lpEnumFunc'は'int (__stdcall *)()'型として定義されているので 'int (__stdcall *)(void *, long)'型は渡せない
定義元のwinuser.hを調べてみましたが、問題なさそうに見えます。
typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);
(中略)
typedef FARPROC WNDENUMPROC;
(中略)
WINUSERAPI
BOOL
WINAPI
EnumChildWindows(
    IN HWND hWndParent,
    IN WNDENUMPROC lpEnumFunc,
    IN LPARAM lParam);
オプション設定に関しては、デフォルトのままでいじっていません。 Webで調べてみても、それらしき情報(バグ情報含)は得られませんでした。 因みに、EnumChildProc(HWND hWnd,long lparam)関数の全部の引数を無くすと 一応、問題なくビルドできます。 ……出来た所で、ハンドルが取得できないので意味無いですが。 因みに上記のソースは、VisualC++6.0では問題なくビルドできますし、 問題なく動作しています。 (じゃぁ、VC++でやれば?と言う突っ込みは無しで)

douglas@ax.powerzoo.net
PostPet: