- ベストアンサー
BCC5.5とBCCFormを使用し、実行ファイルを作成したが、実行できません。
当方、只今C言語でWin32APIを呼び出し、Windowsアプリを開発中です。 そこで質問なのですが、以下の手順で作業した場合、抽出される実行ファイルが実行できません。 どなたかお分かりになる方、助言の方よろしくお願いします。 1.名前、住所をリッチテキストに入力し、OKボタンを押下後、メッセージボックス にて”○○さんの住所は○○です”と表示されるソースコードを"bcc32 -W source.cpp"でコンパイル。 2.BCCFormで作成したリソースファイルを"brc32 dialog.rc source.exe"で結合。 3.source.exeを実行するが、動作しない。 ちなみに環境はWindowsXPSP3です。 下記にまず、ソースコードを表示します。 /* ソース */ /* ファイル名 source.cpp */ #if 1 /* ダイアログボックスを出す */ #include <windows.h> #include "Resdialog.h" BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { DialogBox(hCurInst, "MYDLG", NULL, (DLGPROC)MyDlgProc); return 0; } BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { char szBuf[128], szBuf1[64], szBuf2[64]; switch(msg){ case WM_COMMAND: switch (LOWORD(wp)){ case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDOK: GetDlgItemText(hDlg, IDC_RICHEDIT102, szBuf1, (int)sizeof(szBuf1)); GetDlgItemText(hDlg, IDC_RICHEDIT103, szBuf2, (int)sizeof(szBuf2)); wsprintf(szBuf, "あなたの住所は%sで、氏名は%sです", szBuf1, szBuf2); MessageBox(hDlg, szBuf, "ダイアログボックス", MB_OK); return TRUE; } return FALSE; } return FALSE; } #endif そして、リソーススクリプトです。 /* リソーススクリプト */ /* ファイル名 dialog.rc */ //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "Resdialog.h" //---------------------------------- // ダイアログ (MYDLG) //---------------------------------- MYDLG DIALOG DISCARDABLE 0, 0, 270, 117 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT CAPTION "Form" FONT 8, "MS 明朝" { CONTROL "名前", IDC_LABEL100, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 10, 46, 18 CONTROL "住所", IDC_LABEL101, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 41, 47, 17 CONTROL "", IDC_RICHEDIT102, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 8, 159, 25 CONTROL "", IDC_RICHEDIT103, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 40, 160, 24 CONTROL "OK", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 49, 85, 61, 18 CONTROL "Cancell", IDCANCELL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 165, 84, 56, 18 } そして、リソースヘッダです。 /* リソースヘッダ */ /* ファイル名Resdialog.h */ //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // ダイアログリソース //--------------------- // ダイアログ MYDLG #define IDC_LABEL100 100 #define IDC_LABEL101 101 #define IDC_RICHEDIT102 102 #define IDC_RICHEDIT103 103 #define IDCANCELL 105 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //-------------------- //------------------ // ヴァージョン情報 //------------------ 上記のようになってます。 どうかご教授の方、宜しくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。 当方、「VC++ Ver 5.0」&「Borland C++ Complier 5.5」で試してみました。 当方も、最初、ダイアログが表示されなかったのですが、いろいろ調査してみた 結果、どうやら、ダイアログでリッチエディットコントロールを使用する場合は、 予め"RICHED32.DLL"をロードしておかないと、ダイアログ生成で失敗するよう だと判りました。 ※リッチエディットコントロールではなく、通常のエディットコントロールを使用した 場合は問題ないようです。 ■参考サイト RichEdit で TEXT を表示 http://www13.plala.or.jp/kmaeda/winc/richtext.htm WinMain内で、LoadLibrary関数により、"RICHED32.DLL"をロードするように したら、「VC++ Ver 5.0」&「Borland C++ 5.5」両方で、無事にダイアログが 表示されるようになりました。 以下は、当方で試したソース一式です。 注)下記ソース一式は、「Borland C++ Complier 5.5」用のものです。 宜しければ試してみて下さい。 ※質問者さんの環境で上手くビルド&実行できなかった場合はすみません。 ■ソース一式(メインソース、ヘッダー、リソース定義ファイル、バッチファイル) 注)インデントのため全角スペースを入れています。 ◎メインソース(source.cpp) ========================= /* ソース */ /* ファイル名 source.cpp */ /* ダイアログボックスを出す */ #include <windows.h> #include <winuser.h> #include <winbase.h> #include <richedit.h> #include "Resdialog.h" //== Function Prottype == BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM); //== WinMain == int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { DWORD nErrCode; char szBuf[256]; //"RICHED32.DLL"のロード HMODULE hModule; hModule = LoadLibrary( "RICHED32.DLL" ); if( hModule == NULL ){ //ロード失敗なら戻る nErrCode = GetLastError(); wsprintf( szBuf, "Load library error.[code=%d]\n", nErrCode ); OutputDebugString( szBuf ); return FALSE; } //ダイアログの生成&起動 int retCode; retCode = DialogBox( hCurInst, "MYDLG", NULL, (DLGPROC)MyDlgProc ); if( retCode == -1 ){ //生成失敗なら戻る nErrCode = GetLastError(); wsprintf( szBuf, "DialogBox create error.[code=%d]\n", nErrCode ); OutputDebugString( szBuf ); FreeLibrary( hModule ); return FALSE; } //DLLの解放 FreeLibrary( hModule ); return TRUE; } //== Dialog Process (CallBack) == BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { HWND g_hEdit1; //Rich Edit 1 Handle HWND g_hEdit2; //Rich Edit 2 Handle char szBuf[128], szBuf1[64], szBuf2[64]; //メッセージ処理 switch(msg) { case WM_INITDIALOG: //ダイアログの初期化処理 //リッチエディットボックスのテキストクリア g_hEdit1= GetDlgItem( hDlg, IDC_RICHEDIT102 ); SetWindowText( g_hEdit1, "" ); g_hEdit2= GetDlgItem( hDlg, IDC_RICHEDIT103 ); SetWindowText( g_hEdit2, "" ); break; case WM_COMMAND: //ダイアログ上コントロールのメッセージ処理 switch (LOWORD(wp)) { case IDCANCEL: //[Cancel]ボタンクリック EndDialog( hDlg, IDCANCEL ); return TRUE; case IDOK: //[OK]ボタンクリック //リッチエディットボックスの入力文字列の表示 GetDlgItemText( hDlg, IDC_RICHEDIT102, szBuf1, (int)sizeof(szBuf1) ); GetDlgItemText( hDlg, IDC_RICHEDIT103, szBuf2, (int)sizeof(szBuf2) ); wsprintf( szBuf, "あなたの氏名は %s で、住所は %s です", szBuf1, szBuf2 ); MessageBox( hDlg, szBuf, "ダイアログボックス", MB_OK ); //PostMessage( hDlg, WM_CLOSE, 0, 0 ); //※ここでは閉じない return TRUE; } break; case WM_CLOSE: //ダイアログのクローズ処理 //・システムメニューの[閉じる] or 右上の[閉じる]ボタン // のクリック時の処理 EndDialog( hDlg, TRUE ); return TRUE; } return FALSE; } ========================= ◎ヘッダー(Resdialog.h) ========================= /* リソースヘッダ */ /* ファイル名Resdialog.h */ //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // ダイアログリソース //--------------------- // ダイアログ MYDLG #define IDC_LABEL100 100 #define IDC_LABEL101 101 #define IDC_RICHEDIT102 102 #define IDC_RICHEDIT103 103 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //-------------------- //------------------ // ヴァージョン情報 //------------------ ========================= ◎リソース定義ファイル(dialog.rc) ========================= /* リソーススクリプト */ /* ファイル名 dialog.rc */ //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "Resdialog.h" //---------------------------------- // ダイアログ (MYDLG) //---------------------------------- MYDLG DIALOG DISCARDABLE 0, 0, 270, 117 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT CAPTION "Form" FONT 8, "MS 明朝" BEGIN LTEXT "名前", IDC_LABEL100, 10, 10, 46, 18 LTEXT "住所", IDC_LABEL101, 10, 41, 47, 17 CONTROL "", IDC_RICHEDIT102, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 8, 159, 25 CONTROL "", IDC_RICHEDIT103, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 40, 160, 24 DEFPUSHBUTTON "OK", IDOK, 49, 85, 61, 18 PUSHBUTTON "Cancel", IDCANCEL, 165, 84, 56, 18 END ========================= ◎Makeに使用したバッチファイル(make1.bat) ========================= bcc32 -W -w-8057 source.cpp brc32 dialog.rc source.exe ========================= ※当方は↑このコマンドで問題なくコンパイル&リンクできました。 以上です。参考になれば幸いです。
その他の回答 (6)
- usatan2
- ベストアンサー率37% (163/436)
当方、WinXP 上で BccWin + BCCForm で確認しました。 No6さんと結局は同じですが、 Winmain()の先頭に次の1行を追加すれば動きますよ。 if(LoadLibrary( "RICHED32.DLL" ) == NULL )return 0; ご存知かもしれませんが、BCCでプログラミングするのなら、Visual Windows for BC++(BccWin)が便利で快適ですよ。
お礼
さっそくのご回答ありがとうございます。 記述していただいた、 if(LoadLibrary( "RICHED32.DLL" ) == NULL )return 0; を貼り付け、コンパイル、リンクしてみるときちんとダイアログが表示されました。 本当にありがとうございます!!!!
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
お疲れ様です。 source.obj source.exe dialog.res この3つを削除された上で、最初からやり直し。 「brc32 dialog.rc source.exe」 の前後でsource.exeの更新日付が変わらないようであれば、おかしいのだと思います。 brc32を使わない方法については暇なときに調査してみます。
お礼
早速のご回答ありがとうございます。 貴重なご意見ありがとうございました。 今後の参考にさせて頂きます!!!!
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
sourceのコンパイルが出来ていて、リソースファイルのコンパイルが出来ないという事は、環境の問題だと思います。 気になって、googleにて「brc32.exe」で検索してみました。 見てみると「brc32.exe」自体にバグがあり、リンクしてくれないという現象が発生するようです。。。 (参考URLを記載しました。) 貴方の疑問が解けることを祈ります。
補足
本当ですね。 確かに、brc32 dialog.rc source.exeとタイプしても、 exeファイルのサイズが変わっていません。。。 とにかくお教えいただいた、ilink32の方法でリンクする方法を探してみます。 本当にありがとうございました。
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
#2です。 手探りでリソースを作っていたため、参照したHPの内容のままでした。 以下の2行は消しても大丈夫そうです。。。 #include <commctrl.h> #include <richedit.h>
補足
本当にお世話になります。 さて、 #include <commctrl.h> #include <richedit.h> を削除し、brc32 dialog.rc source.exeとタイプしたところ、 今度はwindows.hが開けないとのエラーが出、 #include <windows.h> も削除し、再度コマンドを入力したところ、 Error CustomDialog.rc 17 27: Expecting signed short integer といエラーが出ました。 お手数かけますが、再度ご教授の方、宜しくお願いします。 本当に申し訳ございません
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
まず断っておきますがbcc5.5の環境がないため、もしかしたら本当の原因とは違うかもしれません。 [visual studio + visuta]の環境で作ってみました。 DialogBox関数の実行結果(戻り値)が-1でした。 そこでMSDNのヘルプを見ると、関数の実行が失敗した場合に-1を返すとなっていました。 また、「拡張エラー情報は別の関数で取得します」と記載されていました。 しかし、その別の関数の名前が分かりませんでした。 で、多分リソースファイルが間違っているのだろうと予想をつけて、私も慣れていませんがリソースファイルを書き換えてみました。 ------------------------------------------------------- #include "Resdialog.h" #include <commctrl.h> #include <windows.h> #include <richedit.h> //---------------------------------- // ダイアログ (MYDLG) //---------------------------------- MYDLG DIALOG DISCARDABLE 0, 0, 270, 117 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT CAPTION "Form" FONT 8, "MS 明朝" BEGIN LTEXT, "名前", IDC_LABEL100, 10, 10, 46, 18, WS_CHILD | WS_VISIBLE | SS_NOTIFY LTEXT, "住所", IDC_LABEL101, 10, 41, 47, 17, WS_CHILD | WS_VISIBLE | SS_NOTIFY EDITTEXT, IDC_RICHEDIT102 , 88, 8, 159, 25, ES_AUTOHSCROLL EDITTEXT, IDC_RICHEDIT103 , 88, 40, 160, 24, ES_AUTOHSCROLL DEFPUSHBUTTON, "OK", IDOK, 49, 85, 61, 18, WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON DEFPUSHBUTTON, "Cancell", IDCANCELL, 165, 84, 56, 18, WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON END ------------------------------------------------------- これでVCでは目的の事が実行されているようです。 リソースファイルをまともに書いたことは無いので自信はありません。。。
補足
早速のご回答、誠にありがとうございます。 hiro knighさんのおっしゃった通り、 リソースファイルを記述し直して、 brc32 dialog.rc source.exe としたところ、以下のエラーが出ました。 Error dialog.rc 2 11: Cannot open file: commctrl.h と出て、commctrl.hが無いのかな?と調べたんですが、 ありました。 どうして、このヘッダが開けないのかが謎です。。。 なんだか、ちぐはぐなお返事になって申し訳ありません。
- z64423
- ベストアンサー率53% (26/49)
デバッガを使って、デバッグしましょう。 > 3.source.exeを実行するが、動作しない。 というのがよく分かりませんが、 実行するとすぐ終了(A)するのか、 ダンマリで何も起こらず終了もしない(B)のか、 それとも、まともな EXE になってなくて、起動時に OS に怒られれて実行できない(C)のか。 デバッガが無くて、かつ A or B なら あんまり良くない方法ですが、以下の方法で問題点を特定してみてください。 1) 関数追加 - 引数で指定した回数、ビープ音が鳴る void DebugBeep(int n) { while (n-- > 0) { MessageBeep(0xFFFFFFFF); Sleep(200); } } ※当然ながら、スピーカーが鳴るようにしておく(ただしボリュームは絞って)。 1) WinMain() 内の DialogBox() 呼び出しの前後、 MyDlgProc() 内の入り口と出口、switch 文の case の後などに DebugBeep() を追加。 ※引数はすべて変える。 1以上の値を指定。 2) コンパイルして実行。 3) DebugBeep() で指定した回数、ビープ音が鳴っていれば、 その位置までは実行していることが分かる。
補足
早速のご回答ありがとうございます。 source.exeを実行するが、動作しないというのは、 z64423さんのおっしゃるBのケースに当てはまりました。 そして下記の様にソースを記述し直すと BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { char szBuf[128], szBuf1[64], szBuf2[64]; switch(msg){ case WM_COMMAND: DebugBeep(5); /* 以下同じ */ ビープ音が鳴りませんでした。 という事はswitch文に入っていないという事がわかりました。 そこであつかましいのですが、何故switch文に入らないのでしょうか?? 申し訳ございませんが、ご教授よろしくお願いします。
お礼
さっそくのご回答ありがとうございました。 ご指摘のあったようにコードを記述しなおし、 コンパイル、リンクしてみたところ、見事ダイアログボックスが出てくれました! 本当にありがとうございます!!!!