ページ 11

WindowsSDK

Posted: 2008年10月18日(土) 22:49
by DIL
先ほど、猫でもわかるプログラミング(http://www.kumei.ne.jp/c_lang/)のWindows SDK編を始めたのですが、イントロダクションでいきなりエラーがでてしまい困っています。
コードと出たエラーとその行番号を↓に書いておきます。
エラーの指している意味もよくわからないので、よろしければエラーの指している意味の説明もよろしくお願いします。
環境はVC++2008,WindowsVistaHomePremiumです。
#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
char szClassNme[/url]="ウィンドウクラス・ネーム";

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInst,LPSTR lpszCmdLine,int nCmdShow)
{
	HWND hWnd;
	MSG msg;
	WNDCLASS myProg;
	if(!hPreInst){
		myProg.style		=CS_HREDRAW | CS_VREDRAW;
		myProg.lpfnWndProc	=WndProc;
		myProg.cbClsExtra	=0;
		myProg.cbWndExtra	=0;
		myProg.hInstance	=hInstance;
		myProg.hIcon		=NULL;
		myProg.hCursor		=LoadCursor(NULL,IDC_ARROW);
		myProg.hbrBackground=GetStockObject(WHITE_BRUSH);
		myProg.lpszMenuName	=NULL;
		myProg.lpszClassName=szClassNme;
		if(!RegisterClass(&myProg))
			return FALSE;
	}
	hWnd=CreateWindow(
		szClassNme,
		"WINAPI",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);
	while(GetMessage(&msg,NULL,0,0)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return(msg.wParam);
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch(msg){
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return(DefWindowProc(hWnd,msg,wParam,lParam));
	}
	return(0L);
}
19行 error C2440: '=' : 'HGDIOBJ' から 'HBRUSH' に変換できません。
21行 error C2440: '=' : 'char [25]' から 'LPCWSTR' に変換できません。
36行 error C2664: 'CreateWindowExW' : 2 番目の引数を 'char [25]' から 'LPCWSTR' に変換できません。

Re:WindowsSDK

Posted: 2008年10月18日(土) 23:02
by tk-xleader
> 19行 error C2440: '=' : 'HGDIOBJ' から 'HBRUSH' に変換できません。

これは、ポインタの型が異なるので、そのままでは代入できないということです。
キャストすればいいです。

>21行 error C2440: '=' : 'char [25]' から 'LPCWSTR' に変換できません。
>36行 error C2664: 'CreateWindowExW' : 2 番目の引数を 'char [25]' から 'LPCWSTR' に変換できません。

VC2008では、Win32 APIの文字型のデフォルトがwchar_tです。そのため、文字列リテラル全体を、

TEXT("ABC")

のようにする必要があります。

Re:WindowsSDK

Posted: 2008年10月18日(土) 23:40
by DIL
素早い回答ありがとうございます。
19行と21行のエラーはおかげさまで解消しました。
しかし、いまだに36行のエラーが残ってしまいます。
TEXT("NULL") としてもでるのですが、どうしたらよいでしょう。
それと、36行目は11番目の引数だと思うのですがエラーでは2番目の引数となっています。
これはどういうことなのでしょう?
一応2番目の引数の"WINAPI"をTEXT("WINAPI")としてみましたがやはりだめでした。

Re:WindowsSDK

Posted: 2008年10月19日(日) 00:14
by たかぎ
> それと、36行目は11番目の引数だと思うのですがエラーでは2番目の引数となっています。
> これはどういうことなのでしょう?

構文解析の都合上、関数呼出し式で構文エラーを検出した場合、その関数呼出し式の最初か最後の行を報告することがよくあります。
確かに、実際にエラーを含む行を報告した方が親切なのですが、2番目の引数となっている式自体は構文の間違いを含んでいないので、このようになってしまうのでしょう。
# 私もパーサーをよく作るので、この辺の面倒くささはよく分かります。

> 一応2番目の引数の"WINAPI"をTEXT("WINAPI")としてみましたがやはりだめでした。

どう駄目だったのでしょうか?

Re:WindowsSDK

Posted: 2008年10月19日(日) 00:26
by すく
char szClassNme[/url]="ウィンドウクラス・ネーム";

ここをLPCWSTRで宣言してみては?

Re:WindowsSDK

Posted: 2008年10月19日(日) 00:38
by すく
あ勘違いしました間違いです。

Re:WindowsSDK

Posted: 2008年10月19日(日) 00:39
by DIL
>構文解析の都合上、関数呼出し式で構文エラーを検出した場合、その関数呼出し式の最初か最後の行を報告す
>ることがよくあります。
なるほど、そのような事情があったのですか。

>どう駄目だったのでしょうか?
error C2664: 'CreateWindowExW' : 2 番目の引数を 'char [25]' から 'LPCWSTR' に変換できません。
というエラーが出てしまうということでしたが、たかぎさんの説明で直すべき個所がわかりました。
szClassNmeもTEXT("szClassNme")としなければなりませんでした。


たかぎさんとtkmakwins15さんのお二方の回答のおかげでうまくビルドできました。
ありがとうございました。

Win32APIはいろいろと難しそうなので、また質問させていただくと思いますがその時もよろしくおねがいします。

Re:WindowsSDK

Posted: 2008年10月19日(日) 06:40
by 組木紙織
型変換の部分でのエラーは、C++でコンパイルしているからだろうと思います。
拡張子を.cにしてCでコンパイルしてあげればキャストを使う回数が減ります。

Re:WindowsSDK

Posted: 2008年10月19日(日) 09:44
by DIL
ありがとうございます。拡張子を変えたら、キャストしなくてもコンパイルできました。
どうしてCでコンパイルするとキャストしなくても大丈夫なんですか?

Re:WindowsSDK

Posted: 2008年10月19日(日) 13:04
by tk-xleader
CのほうがC++よりも型のチェックが厳しいからです。

Re:WindowsSDK

Posted: 2008年10月19日(日) 13:08
by tk-xleader
すみません、まったく逆のことを書いてました。
Cのほうが緩いです。

Re:WindowsSDK

Posted: 2008年10月19日(日) 13:15
by DIL
ありがとうございます。
型のチェックの問題だったんですか。
不都合が生じたりするからだとおもってました。