WindowsSDK

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DIL

WindowsSDK

#1

投稿記事 by DIL » 16年前

先ほど、猫でもわかるプログラミング(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' に変換できません。

tk-xleader

Re:WindowsSDK

#2

投稿記事 by tk-xleader » 16年前

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

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

DIL

Re:WindowsSDK

#3

投稿記事 by DIL » 16年前

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

たかぎ

Re:WindowsSDK

#4

投稿記事 by たかぎ » 16年前

> それと、36行目は11番目の引数だと思うのですがエラーでは2番目の引数となっています。
> これはどういうことなのでしょう?

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

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

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

すく

Re:WindowsSDK

#5

投稿記事 by すく » 16年前

char szClassNme[/url]="ウィンドウクラス・ネーム";

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

すく

Re:WindowsSDK

#6

投稿記事 by すく » 16年前

あ勘違いしました間違いです。

DIL

Re:WindowsSDK

#7

投稿記事 by DIL » 16年前

>構文解析の都合上、関数呼出し式で構文エラーを検出した場合、その関数呼出し式の最初か最後の行を報告す
>ることがよくあります。
なるほど、そのような事情があったのですか。

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


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

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

組木紙織

Re:WindowsSDK

#8

投稿記事 by 組木紙織 » 16年前

型変換の部分でのエラーは、C++でコンパイルしているからだろうと思います。
拡張子を.cにしてCでコンパイルしてあげればキャストを使う回数が減ります。

DIL

Re:WindowsSDK

#9

投稿記事 by DIL » 16年前

ありがとうございます。拡張子を変えたら、キャストしなくてもコンパイルできました。
どうしてCでコンパイルするとキャストしなくても大丈夫なんですか?

tk-xleader

Re:WindowsSDK

#10

投稿記事 by tk-xleader » 16年前

CのほうがC++よりも型のチェックが厳しいからです。

tk-xleader

Re:WindowsSDK

#11

投稿記事 by tk-xleader » 16年前

すみません、まったく逆のことを書いてました。
Cのほうが緩いです。

DIL

Re:WindowsSDK

#12

投稿記事 by DIL » 16年前

ありがとうございます。
型のチェックの問題だったんですか。
不都合が生じたりするからだとおもってました。

閉鎖

“C言語何でも質問掲示板” へ戻る