こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Windowsプログラミングのひな形の段階でエラーが出てしまいます。

指定されたパスが見つかりませんと出てウィンドウが生成されません。
コードが違うのでしょうか・・それともプロジェクトの作り方に問題があるのでしょうか。VisualStudio2005のVisual C++でつくっています。
以下コードです↓
//hinagata.cpp

#include<windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);

char szClassName[]="hinagata";

int WINAPIMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,LPSTR lpsCmdline,int nCmdShow)
{
MSG msg;
BOOL bRet;

if(!InitApp(hCurInst))
return FALSE;
if(!InitInstance(hCurInst,nCmdShow))
return FALSE;
while((bRet=GetMessage)&msg,NULL,0,0))!=0){
if(bRet==-1){
MessageBox(NULL,"GetMessageエラー","Error",MB_OK);
break;
}else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return(int)msg.wParam;
}
//ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=WndProc; //プロシージャ名
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;//インスタンス
wc.hIcon=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE |LR_SHARED);
wc.hCursor=(HCORSOR)Loadimage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;//メニュー名
wc.lpszClassName=(LPCSTR)szClassName;
wc.hIconSm=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);

return(RegisterClassEx(&wc));
}
//ウィンドウの作成
BOOL InitInstance(HINSTANCE hInst,int nCmsShow)
{
HWND hWnd;

hWnd=CreateWindow(szClassName,
//タイトルバーにこの名前が表示される
"犬でもわかるWindowsプログラミング",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL);
if(!hWnd)
return FALSE;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}

//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
break;
dafault:
return(DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
}

投稿日時 - 2007-09-15 23:43:29

QNo.3348456

すぐに回答ほしいです

質問者が選んだベストアンサー

★yuzutamago さん。
・回答 No.2 の
>間違い⇒『WINAPIMain』
>正しい⇒『WINAPI WinMain』
 ↑
 これは『WINAPI』と『WinMain』の間にスペースが1個あります。
 ここを直せば私の環境ではコンパイルできました。
 スペースを1個挿入して下さい。
 タイプミスが多いのでちゃんとソースを見直して下さい。
・以上。ちなみに環境は Windows XP Home SP2、VC++2003.NET です。

投稿日時 - 2007-09-16 17:15:14

お礼

ちゃんとビルドされました!
Oh-Orangeさん本当にありがとうございます。

投稿日時 - 2007-09-16 17:38:26

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

★補足要求します。
・『この回答への補足』にエラーメッセージを貼り付けて下さい。
・『この回答へのお礼』に修正したソースを貼り付けて下さい。
・それでは。また。

投稿日時 - 2007-09-16 09:56:44

補足

長くて投稿できないようなのでソースを二つに分割しました。

//ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=WndProc; //プロシージャ名
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;//インスタンス
wc.hIcon=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE |LR_SHARED);
wc.hCursor=(HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;//メニュー名
wc.lpszClassName=(LPCSTR)szClassName;
wc.hIconSm=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);

return(RegisterClassEx(&wc));
}
//ウィンドウの作成
BOOL InitInstance(HINSTANCE hInst,int nCmdShow)
{
HWND hWnd;

hWnd=CreateWindow(szClassName,
//タイトルバーにこの名前が表示される
"犬でもわかるWindowsプログラミング",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL);
if(!hWnd)
return FALSE;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}

//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
}


エラーメッセージ
・未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
・fatal error LNK1120: 外部参照 1 が未解決です。

投稿日時 - 2007-09-16 14:03:05

お礼

#include<windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);

char szClassName[]="hinagata";

int WINAPIWinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,LPSTR lpsCmdline,int nCmdShow)
{
MSG msg;
BOOL bRet;

if(!InitApp(hCurInst))
return FALSE;
if(!InitInstance(hCurInst,nCmdShow))
return FALSE;
while((bRet=GetMessage(&msg,NULL,0,0))!=0){
if(bRet==-1){
MessageBox(NULL,"GetMessageエラー","Error",MB_OK);
break;
}else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return(int)msg.wParam;
}
//ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=WndProc; //プロシージャ名
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;//インスタンス
wc.hIcon=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE |LR_SHARED);
wc.hCursor=(HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;//メニュー名
wc.lpszClassName=(LPCSTR)szClassName;
wc.hIconSm=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);

return(RegisterClassEx(&wc));

投稿日時 - 2007-09-16 14:02:50

ANo.4

★VC++2005 では文字セットが Unicode になっています。
・このため文字列を "あいうえお" とするとエラーになります。
 よって TEXT() マクロを使って TEXT("あいうえお") とします。
 面倒な場合はオプション設定で文字セットを『マルチバイト文字コード』に
 変更して下さい。
・以上。詳しくは下の『参考URL』をどうぞ。

参考URL:http://www.usefullcode.net/2006/11/tcharlpctstrlptstr.html

投稿日時 - 2007-09-16 01:04:17

お礼

それも変えましたけどダメなようです。。
Oh-Orangeさんほんと何回もすみません。

投稿日時 - 2007-09-16 01:09:47

ANo.3

★オプションを変えて下さい。
・というよりはプロジェクトを Win32 アプリケーションで作成し直してください。
 お礼にあるエラーメッセージはコンソール・アプリケーションでプロジェクトを
 作っています。Win32 アプリケーションとしてプロジェクトを作成しなおしてから
 ソースファイルなどを設定しなおします。
・以上。結果報告を待っています。でももう寝ます。

投稿日時 - 2007-09-16 00:45:33

お礼

コンソールではなく最初からWin32で作成しました。
言われた通りプロジェクトを作り直しましたが、同じエラーメッセージが出ます。もうお手上げです><;

投稿日時 - 2007-09-16 00:56:28

ANo.2

★アドバイス
・最初の場所でエラーが出ませんか?
 間違い⇒『WINAPIMain』
 正しい⇒『WINAPI WinMain』
 ※タイプミスには気をつけましょう。→あまり人の事はいえないけど。
・WinMain()の次の場所もエラーが出ませんか?
 間違い⇒『while((bRet=GetMessage)&msg,NULL,0,0))!=0){』
 正しい⇒『while((bRet=GetMessage(&msg,NULL,0,0))!=0){』
 ※これはタイプミスだね。→カッコの向きが違っている。
・InitApp()の次の場所もエラーが出ませんか?
 間違い⇒『wc.hCursor=(HCORSOR)Loadimage(NULL,』
 正しい⇒『wc.hCursor=(HCURSOR)Loadimage(NULL,』
 ※『HCURSOR』が正しい型。タイプミス。
・WndProc()の次の場所もエラーが出ませんか?
 間違い⇒『dafault:』
 正しい⇒『default:』
 ※『default』が正しい型。これもタイプミス。
・以上の4つのタイプミスによりエラーになっていると思います。
 ちゃんとソースを見直して下さい。
 あとキーワードに色が付けれるエディタを用意しましょう。
・以上。

投稿日時 - 2007-09-16 00:22:15

お礼

ありがとうございます。タイプミスが多すぎました;;
一通り指摘された箇所を直してビルドしたんですが、

・未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
・外部参照 1 が未解決です。
と二つエラーが出てしまいました。勉強し始めなので何がなんやらさっぱりです。。この点についても直し方を教えて頂きたいのですが。

投稿日時 - 2007-09-16 00:34:53

ANo.1

Wr5

> VisualStudio2005のVisual C++でつくっています。

ExpressEditionですか?それ以外ですか?
ExpressEditionの場合、WindowsSDKを使用する際の設定は正しくやっていますか?
やっていない場合は
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/
を参照の上設定してください。

> char szClassName[]="hinagata";

プロジェクトのプロパティ(の構成プロパティ)から、
文字セットを「マルチ バイト文字セットを使用する」に変更しまたか?
VisualStudio2005ではデォルトは「Unicode 文字セットを使用する」になっていますから
この書き方ではエラーになるかと。

参考にしている「猫でもわかるプログラミング」のページにVisualStudio2005について書かれたページがありますので参照してください。
http://www.kumei.ne.jp/c_lang/net2005/index.html
http://www.kumei.ne.jp/c_lang/net2005/project.htm
http://www.kumei.ne.jp/c_lang/net2005/sample.htm

投稿日時 - 2007-09-16 00:00:11

補足

回答ありがとうございます。
アカデミックエディションを使用しています。
>while((bRet=GetMessage)&msg,NULL,0,0))!=0){
この行にエラーが出て"BOLL"から"BOLL"に変換できませんと出るのですが。。
文字セットは言われた通り先ほど変更しました。

投稿日時 - 2007-09-16 00:10:36

お礼

>この行にエラーが出て"BOLL"から"BOLL"に変換できませんと出るのですが。。

訂正しますBOOLからBOOLですね。

投稿日時 - 2007-09-16 00:15:54

あなたにオススメの質問