No.13ベストアンサー
- 回答日時:
★原因は wc.hCursor を設定していなかった。
・ウィンドウクラスの登録 InitApp() 関数の構造体メンバ wc.hCursor にカーソルの
ハンドルをセットしていないのでウインドウが正しく表示されなかったようです。
マウスカーソルのハンドルをセットしてコンパイルすると表示され、コメントアウト
すると正常にコンパイルできても実行時に表示されなくなりました。お陰で今後の
ちょっとしたミスに気づく良い経験になりました。有り難うございます。
・要するに sakusaker7 さんのアドバイス通りですね。ただし、
>InitApp で登録しようとしている情報で、hIconメンバーに対する代入を行っていませんが
>ポカミスですか?
は『hIcon』ではなく『hCursor』ですね。→sakusaker7 さんもポカミスですね(笑)
その他:
・LoadImage() 関数の引数が多いため便利マクロ関数を紹介します。
#define MacroLoadIcon(inst,id) (HICON)LoadImage(inst,id,IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED)
#define MacroLoadCursor(inst,id) (HCURSOR)LoadImage(inst,id,IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED)
マクロ関数名は適当に変更してお使い下さい。
使い方は InitApp() 関数を例に
wc.hIcon = MacroLoadIcon( NULL, MAKEINTRESOURCE(IDI_APPLICATION) );
wc.hIconSm = MacroLoadIcon( NULL, MAKEINTRESOURCE(IDI_APPLICATION) );
wc.hCursor = MacroLoadCursor( NULL, MAKEINTRESOURCE(IDC_ARROW) );
と使います。『inst』がインスタンスハンドルで『id』が識別文字列です。
・このマクロ関数は、LoadIcon()、LoadCursor() 関数に合わせて命名と引数を決めています。
実際の LoadIcon()、LoadCursor() 関数を使っても良いが、MSDN マニュアルに
>注意 この関数は、LoadImage 関数に取って代わられました。
となっています。もう古い関数群ですので今後は LoadImage() 関数を使えって事かな。
そこで参考にしている『猫でもわかるwindowsプログラミング』の本は積極的に
LoadImage() 関数を使っているようだ。
・私も普段は LoadImage() 関数をマクロ定義して使っている。→上記で紹介したマクロだ。
ただし、マクロ名を TipAPILoadIcon、TipAPILoadCurosor として使っています。
他にもたくさんのマクロ関数を定義して使っています。
・もう一つ『break』付きの case、default キーワードを紹介します。
#define CASE break;case
#define DEFAULT break;default
使い方はウィンドウプロシージャを例に
switch(msg){
CASE WM_CREATE:
/* 処理 */
CASE WM_COMMAND:
/* 処理 */
CASE WM_PAINT:
/* 処理 */
CASE WM_CLOSE:
/* 処理 */
CASE WM_DESTROY:
PostQuitMessage(0);
DEFAULT:
return DefWindowProc(hWnd, msg, wp, lp );
}
と使います。switch 文の多くは break して抜けることが多いため私は CASE、DEFAULT の
記号定数キーワードを使っています。本来の case、default と分けるために大文字にしています。
また、break なしの CASE を使いたいときは本来の case を記述すればよい。
良かったらお使い下さい。→使うときにはヘッダ部に記述するとか他の人でも分かりやすくしておく。
・以上。おわり。
貴重な時間を割いてのアドバイス、有難うございます。
ご指摘のとおり 『wc.hCursor = (HCURSOR)LoadImage()~』の、ハンドルが設定してありませんでした、
ソースを書き直すたびに何度も確認をしたのですが、『コンパイルが来た』と言うだけで別に原因があるものと思い込んでいたようです。
確認がおろそかでした。今は無事実行することが出来、『画面の表示も出来ます。』本当に有難うございました。
また、参考となるアドバイスをたくさんして頂きとても感謝しています。これからの学習にとても助かります。
まだ未熟なためご迷惑をおかけしました。
有難うございました。
No.12
- 回答日時:
InitApp で登録しようとしている情報で、hIconメンバーに対する代入を行っていませんが
ポカミスですか?
とりあえずここを追加すれば動いているようですが。
wc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = LoadCursor(NULL,IDC_ARROW); //追加。適当に修正してください
return (RegisterClassEx(&wc));
おまけ。
InitAppとかInitInstanceで失敗したときに単に終了するのではなく、
適当なエラーメッセージを出力するようにしておくと、デバッグしやすいと思います。
まあデバッガを使ってもいいんでしょうけど。
void
ShowErrorCode(LPCSTR msg)
{
LPTSTR lpBuffer;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
LANG_USER_DEFAULT,
(LPTSTR)&lpBuffer,
0,
NULL);
MessageBox(NULL, lpBuffer, msg, MB_ICONHAND|MB_OK);
LocalFree(lpBuffer);
}
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;
if(!InitApp(hCurInst)) {
ShowErrorCode("InitAppで失敗");
return FALSE;
}
if(!InitInstance(hCurInst,nCmdShow)) {
ShowErrorCode("InitInstanceで失敗");
return FALSE;
}
以下略
貴重な時間を割いてのアドバイス大変有難うございます。
ご指摘どおり、『wc.hCursor = LoadCursor(NULL,IDC_ARROW』の所を確認して追加しました。無事に実行でき、ウィンドウも表示されました。
何度も確認をしたのですが、『ポカミスです。』
コンパイルが出来たというだけで、実行されない原因がほかにあるものと思い込んでいたようです。これからの学習にとても参考になりました。
また、いろいろなアドバイスを有難うございます。
これでやっと次のステップに進むことが出来ます、本当に有難うございました。
No.11
- 回答日時:
★コンパイルしたソースをすべて『補足』に貼り付けて下さい。
・かならず、コンパイルしたソースをすべてです。省略なし。
・以上。待っています。
この回答への補足
度々のアドバイス有難うございます。実行できないので最初からソースを書き直していました。
コンパイルは出来て、exeファイルも作られるのですが、やはり画面の表示が出来ません。ご迷惑をおかけします。
これが今書き直してコンパイルできるソースです。
/*sample.cpp*/
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
char szClassName[] = "sample"; /*ウィンドウクラス*/
int WINAPI WinMain(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.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, /*x座標*/
CW_USEDEFAULT, /*y座標*/
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;
}
申し訳ありません、よろしくお願いします。
No.10
- 回答日時:
#9の補足にあるプログラムだと、WndProcの本体がないんですけどいったいどういう状態で
プログラムを作ってますか?
#8のプログラムでは末尾にちゃんとついてますしちょっと不思議です。
#9に#8の末尾のWndProcをつけてもエラーになるのですが、それは以下のようにして
対処してください。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); //←プロトタイプ宣言を追加
// ウィンドウクラス名
元のプログラムの37行目でWndProcという名前を使う前に、その名前がどういう素性のものなのかを
明確にしておかないといけないということです。
WndProc関数を、InitApp関数より前におくことでも対処できますが、まあ関数のプロトタイプを
書く癖をつけておいた方が後々よいのではないかと思います。
この回答への補足
度々のアドバイス有難うございます。
先ず#8の補足の欄にあるソースは、『猫でもわかるwindowsプログラム弟2版』を参考にして私が書いたものです。
コンパイルは出来て、exeファイルも作られるのですが、『画面が表されない』のです。
#9の補足の欄のプログラムは、
#8の回答の中のアドレスから、参考となるプログラムをコピーペーストしたものを使っています。
コピーペーストしたプログラムをそのままコンパイル実行すると、『画面が表示されます。』
でも、コピーペーストしたソースの『lpfnWndProc = DefWindowProc』の所を『lpfnWndProc = WndProc』に変更するとエラーが出ます。
このコピーペーストしたソースには、確認した所 『LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); 』は見つかりませんでした、
そこで今回のご指摘どおり『プロトタイプ宣言をしてみました』
結果は、『lpfnWndProc = DefWindowProc』だと正常に実行されますが、『lpfnWndProc = WndProc』に変更するとやはりエラーとなってしまいます。これからのステップも『猫でもわかるwindowsプログラム弟2版』を参考にして行きたいので、実行させたいのですが何をどうすれば実行できるのか、見当がつきません。もう少しがんばってみます。
No.9
- 回答日時:
>ウインドウクラスの3行目を『WndProc』に変更すると、エラーとなります。
> エラー E2451 sample.cpp 37: 未定義のシンボル WndowProc(関数 InitApp(HINSTANCE__ *) )
*** 1 errors in Compile ***
本当に「WndProcに」変更したのでしょうか?
エラーメッセージを見る限りでは WndowProcという名前を使っているようですけど。
貼り付けられているソースではWndProcですし、何が正解?
この回答への補足
ご迷惑をおかけしています。昨日は気がつきませんでしたが、エラーは『WindowProc』となっていますね、どうしてか分かりません。
ご指摘のように、ウインドクラスの登録の3行目を『wcex.lpfnWndProc = WndProc;』に変更してコンパイルしたものです。(これは、今コンパイルしたものです)
やはりエラーが出てしまいます。申し訳ありませんが、よろしくお願いします。
D:\borland\bcc55\lesson>bcc32 -W -w-8057 sample.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample.cpp:
エラー E2451 sample.cpp 37: 未定義のシンボル WndProc(関数 InitApp(HINSTANCE__ *) )
*** 1 errors in Compile ***
こちらが変更したものです。
#include <windows.h>
// ウィンドウクラス名
static TCHAR szClassName[] = TEXT("クラス名");
// ウィンドウの生成
BOOL InitInstance( HINSTANCE hInst, int nCmdShow )
{
HWND hWnd;
hWnd = CreateWindow( szClassName,
TEXT("タイトル文字列"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL );
if ( hWnd != NULL ){
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
return( TRUE );
}
return( FALSE );
}
// ウィンドウ・クラスの登録
BOOL InitApp( HINSTANCE hInst )
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof( WNDCLASSEX );
wcex.style = (CS_HREDRAW | CS_VREDRAW);
wcex.lpfnWndProc = WndProc; //ここを変更しました。
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInst;
wcex.hIcon = LoadIcon( NULL, MAKEINTRESOURCE(IDI_APPLICATION) );
wcex.hIconSm = LoadIcon( NULL, MAKEINTRESOURCE(IDI_APPLICATION) );
wcex.hCursor = LoadCursor( NULL, MAKEINTRESOURCE(IDC_ARROW) );
wcex.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szClassName;
return( RegisterClassEx(&wcex) );
}
// メイン関数
int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow )
{
BOOL bRet;
MSG Msg;
if ( hPrevInst == NULL ){
if ( !InitApp(hCurInst) ){
return( 0 );
}
}
if ( !InitInstance(hCurInst,nCmdShow) ){
return( 0 );
}
while ( (bRet = GetMessage(&Msg,NULL,0,0)) != 0 ){
if ( bRet < 0 ){
break;
}
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
UNREFERENCED_PARAMETER( lpsCmdLine );
return( (int)Msg.wParam );
}
No.8
- 回答日時:
★過去に似たような質問があるためそれを紹介します。
・http://oshiete1.goo.ne.jp/qa2925643.html→『「猫でもわかるプログラミング」について。』
この質問の回答番号 No.3 をコピー&ペーストして下さい。
なお、全角のスペースをタブ文字に一括変換してからコンパイルして下さい。
・『ウィンドウ・クラスの登録』関数 InitApp() の上から3行目を修正して下さい。
修正前⇒『wcex.lpfnWndProc = DefWindowProc;』
修正後⇒『wcex.lpfnWndProc = WndProc;』
※WndProc がプロシージャ関数ですので名前を修正して下さい。別名ならその名前です。
・上記のソースをコンパイルすれば、真っ白なウインドウ画面が表示されると思います。
お試しあれ。→結果報告を待っています。
参考URL:http://oshiete1.goo.ne.jp/qa2925643.html
この回答への補足
お手数をおかけしてすみません。早速試してみましたので結果を報告します。
1、コピー&ぺーストしたソースをそのまま実行した結果は、無事『白いウインドウ』が表示されました。
2、ウインドウクラスの3行目を『WndProc』に変更すると、エラーとなります。
D:\borland\bcc55\lesson>bcc32 -W -w-8057 sample.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample.cpp:
エラー E2451 sample.cpp 37: 未定義のシンボル WndowProc(関数 InitApp(HINSTANCE__ *) )
*** 1 errors in Compile ***
これが現在苦労しているソースなのですが、ご迷惑でなければ検証していただけますか? 画面が表示されません。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
char szClassName[] = "sample01"; /*ウィンドウクラス*/
int WINAPI WinMain(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.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, //x座標
CW_USEDEFAULT, //y座標
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;
}
No.7
- 回答日時:
★使用されていない変数の警告メッセージを出さない方法。
・私の環境では UNREFERENCED_PARAMETER() マクロ関数が利用できます。
これを使えば、使用されていない変数の警告メッセージが出ません。
使い方は、
UNREFERENCED_PARAMETER( hInstance );
UNREFERENCED_PARAMETER( hPrevInstance );
UNREFERENCED_PARAMETER( lpCmdLine );
UNREFERENCED_PARAMETER( nCmdShow );
とするだけです。
・もし、UNREFERENCED_PARAMETER() マクロがない場合は
#define UNREFERENCED_PARAMETER(x) (x)
か
#define UNREFERENCED_PARAMETER(x) ((x)=(x))
と定義すれば良い。
・あるいは未使用変数を
hInstance = hInstance;
hPrevInstance = hPrevInstance;
lpCmdLine = lpCmdLine;
nCmdShow = nCmdShow;
などとします。
・コンパイラによっては上記のマクロがなかったり、どうしても警告メッセージが
出てしまう事もあるようです。でも新しいコンパイラなら大丈夫かも。未確認ですが…。
その他:
・『簡単なウインドウを表示するプログラム』がまだ実行できないようですが、
ウインドウは表示されますか?
・今、ちなみにどんな『本』や『サイト』を参考にしていますか?
『猫でもわかるシリーズ』の本はともかく、サイトは 10 年前に書かれたページがあります。
特に最初の『簡単なウインドウを表示するプログラム』の記述があるページが古い。
別ページで新しいコンパイラへの対応方法が書かれているが、全ページを新しいコンパイラに
対応するつもりはないようです。→膨大なページだから気持ちは分かりますけどね。
・とりあえず、参考情報でした。
この回答への補足
度々のアドバイス有難うございます。前回のアドバイスのおかげで、
警告も出なくなり無事コンパイルできました。ディレクトリには
sample1.exeも作られましたが、残念ながらまだ、ウインドウは表示されません。
(exeをクリックすれば表示されると思ったのですが?)
参考にしている本は、『猫でもわかるwindowsプログラミング弟2版』です。
その他に、『C言語』などで検索したものを手当たり次第に見ています。
http://202.33.253.145/newsgroups/ ボーランドニュースグループ
http://www9.plala.or.jp/sgwr-t/index.html 初心者のためのポイント学習から掲示板に移動
http://www.digitalpad.co.jp/~takechin/bbs.html susieの部屋
http://www.kumei.ne.jp/c_lang/bcc/index.html 猫でもわかwindowsプログラミング BCCでプログラムを作ろう
特に、『初心者のためのポイント学習の掲示板2』には、同じような相談が載っていましたが、的確な回答はありませんでした。
『猫でもわかる~Bccでプログラムを作ろう』のサンプルを作ってコンパイルした結果、『古い書式』とのコンパイルエラーが出てしまいました。
結果として、『Oh-Orangeさん』のアドバイスが一番参考になりました。コンパイルは出来ているので、後はウインドウを表示させるだけです。いろいろ調べてみます。
お心遣い有難うございます。
No.6
- 回答日時:
C++ Builder 3.0くらいまでは使っていたんですが、今はPCも乗り換えたりで
Borlandのコンパイラは使える状態になってないのでネットで調べました。
警告w8057 って、使ってない変数があるよというやつですね。
ひょっとしてこんな感じででてます?
警告 W8057 yoshi.c 10: パラメータ 'hInstance' は一度も使用されない(関数 WinMain )
警告 W8057 yoshi.c 10: パラメータ 'hPrevInstance' は一度も使用されない(関数 WinMain )
警告 W8057 yoshi.c 10: パラメータ 'lpCmdLine' は一度も使用されない(関数 WinMain )
警告 W8057 yoshi.c 10: パラメータ 'nCmdShow' は一度も使用されない(関数 WinMain )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
WinMainの引数に関しての未使用の警告なら気にしないでもとは思いますが、
まず、どのようなオプション指定でコンパイルしているかを教えてください。
#5の方のような指定なら問題ないと思うのですが、-W つけると -w-xxx が
無効になるなんてのはちょっと考えづらいです。
> ライブラリを調べてWinMain関数を探し出し、Libフォルダの中に入れればいいのでしょうか?
> アドバイスをお願いします。
WinMainの場合は、ユーザーが自分のプログラムで定義すべき関数ですから、
ライブラリにはありません。
自分が作ってコンパイルしようとしているソースファイル(複数あるなら
そのうちのどれかひとつ)の中で定義します。
この回答への補足
わざわざ調べていただき有難うございます。警告w8057の内容は、ご指摘のとおりです。今までのコンパイルの仕方は、『bcc32 -W8057 sample1.cpp』 『bcc32 -W-8057 sample1.cpp』の様にしていました。
今回、Oh-Orangeさんのアドバイスを参考にして、『bcc32 -W-w-8057 sample1.cpp』としてコンパイルした所、『警告』は出ずに無事コンパイル出来ました。
ただ、実行すると『ウインドウが表示』されるプログラムなのですが、
実行時に『\bcc55\lesson>sample1.exe』 『\bcc55\lesson>sample1』の様に入力しているのですがうまくいきません。
今度は、ここでつまずいてしまいました。いろいろ調べてみようと思っています、C言語の時の実行の仕方ではいけないようですね?。
No.5
- 回答日時:
★Win32 アプリケーションならば WinMain() から始めます。
・WinMain() を記述していますか?
なんかコンソール・アプリケーションの設定でコンパイルしていますけど。
『D:\borland\bcc55\lesson>bcc32 -W -w-8057 sample1.cpp』
としてみて下さい。
・『-W』オプションを付けた時には WinMain() 関数から始めて下さい。
main() 関数ではありません。WinMain() は自分でソースに書きます。
Libフォルダに入れる必要はありません。
つまり main() 関数はコンソール・アプリケーションでのエントリーポイントです。
Win32 アプリケーションでは WinMain() 関数から始めます。
参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/w …
この回答への補足
度々のアドバイス有難うございます。前回のアドバイスを参考にして、『エラーコードの読み方、リンクエラーの対処の仕方、コンパイルの仕方』などを検索したのですが、-W-w-8057のような書き方が見つかりませんでした。参考にしている『猫でもわかるwindowsプログラミング』にも記載されていませんでした、ご指摘の記述にするとエラーも、警告も出なくなりました。『簡単なウインドウを表示するプログラム』なのですが、まだ実行できていません、でも、ひと段落着きました。
有難うございます。
No.4
- 回答日時:
補足のところのメッセージを見るに、WindowsのGUIプログラムをコンパイルしようと
しているようですが、でしたら =W オプションが必要ですよ。
-W オプションがないので → コンソール用プログラムだと判断し →
main() を探すが見つからないのでリンク段階でエラーになる。
ということだと思います。
-W オプションをつければ WinMainをユーザー作成プログラムの
エントリポイントとしてリンクをしますので、main()がないという
エラーにはならないと思います。WinMainがないとやっぱりエラーに
なりますけど。
> Error: 外部シンボル '_main' が未解決(C:\PROGRAMFILES\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
> この『外部シンボル'_main'~\CO~×32.OBJが参照』の意味がわかりません。
> Cドライブの\LIBを開いてみたのですがわかりませんでしたこの様なメッセージは、
> どのように調べたらいいのでしょうかアドバイスをお願いします。
Borland C++の場合、プログラムの初期化ルーチンとして伝統的に
xxx.obj(ビルドの条件によって対象のファイル名は変わります)
をリンクします。
この.objファイルからユーザーが定義したmain()なりWinMain()
なりを呼び出します(これが参照しているの意味です)。今回は
main()用の初期化ルーチンが選択されていてかつmain()がどこ
にもないのでリンカがエラーになったというわけです。
C0X32.OBJが見つからないとはどこにも書いてないですし、実際
メッセージにあるディレクトリに存在しているはずです。
どのように調べるかですが、リンク段階で関数が見つからない原因には
いくつか考えられるのですが、
何かのライブラリの中にあるべき関数ならそのライブラリをきちんとリンク対象に含めるかを
確かめることでしょうし、
自分で定義しているはずのものなら、名前を打ち間違えていないかとか
分割コンパイルしているならその名前を含んでいるファイルを
きちんとリンク対象に含めているかをチェックというところでしょう。
この回答への補足
回答ありがとうございます。
コンパイルの時には、-W オプションを付けてコンパイルしているのですが、その時には警告w8057が表示されます、そこでーw-8057としてコンパイルをすると
Error: 外部シンボル '_main' が未解決(C:\PROGRAMFILES\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
と出てしまいます。
C0X32.OBJは、メッセージのディレクトリにあります。そうすると、
>何かのライブラリの中にあるべき関数ならそのライブラリをきちんと
>リンク対象に含めるかを確かめること
ライブラリを調べてWinMain関数を探し出し、Libフォルダの中に入れればいいのでしょうか?
アドバイスをお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ソフトウェア) 一太郎付属の”全件検索”ツールの不具合 3 2023/07/25 15:03
- ブルーレイ・プレーヤー・レコーダー 東芝HDD&ブルーレイディスクレコーダー VARDIA D-B1005K エラー内容について 2 2022/06/26 08:06
- Excel(エクセル) エクセルの複数条件作成方法について 2 2023/01/23 21:38
- Windows 10 プロファイルエラーについて 2 2022/12/16 09:31
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
- PostgreSQL PostgreSQLドライバの登録。 MavenプロジェクトからPostgreSQLへ接続をするため 1 2022/09/26 12:30
- 日本語 漢字の意味について 3 2022/06/15 23:43
- Excel(エクセル) 【マクロ】エラーが発生⇒実行時エラー58既に同名のファイルが存在 5 2022/08/31 10:03
- VPN VPN接続が急にできなくなりました。 1 2022/12/13 15:25
- Visual Basic(VBA) VBAで実行時エラー'424' オブジェクトが必要ですと出る 2 2022/10/07 09:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<math.h>があるのにsqrtが・...
-
C言語でヘッダファイルにグロー...
-
Makefile作成時の拡張子.oとは?
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
セミコロンについて
-
漢字のコメントをはずすとコン...
-
VBAを何回も作り直して、容量が...
-
Win7 64bit のPCが'X86'と誤認識?
-
クリティカルエラー Expressio...
-
マクロ コンパイルがグレーバック
-
右クリックメニューについて
-
コンパイルエラー:ユーザ定義...
-
C++Builder XEのコンパイル&実行
-
” OS ビルド ” の意味が分か...
-
MFCのエラーについて
-
外部シンボル "_main"は未解決です
-
drand48()が使えない
-
Macで Arduino Unoでコンパイル...
-
[c++] <pthread.h>がinclude で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
” OS ビルド ” の意味が分か...
-
Makefile作成時の拡張子.oとは?
-
「fatal error C1189」を回避す...
-
1 つ以上の複数回定義されてい...
-
ILSpyで、デコンパイルできない。
-
C言語でヘッダファイルにグロー...
-
エクセルVBAではRound...
-
セミコロンについて
-
マクロ コンパイルがグレーバック
-
C++コンパイル時に『 C1083: in...
-
外部シンボル "_main"は未解決です
-
PRO*C コンパイルエラー
-
コンパイルエラー:ユーザ定義...
-
クリティカルエラー Expressio...
-
ビルドとリビルドの違いを教え...
-
RPGでプログラムからソースファ...
-
戻り値について
-
C++のhppファイルをCでinclude
おすすめ情報