• ベストアンサー

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 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //-------------------- //------------------ // ヴァージョン情報 //------------------ 上記のようになってます。 どうかご教授の方、宜しくお願いします。

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

  • ベストアンサー
noname#144013
noname#144013
回答No.6

こんにちは。 当方、「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 ========================= ※当方は↑このコマンドで問題なくコンパイル&リンクできました。 以上です。参考になれば幸いです。

HackHack
質問者

お礼

さっそくのご回答ありがとうございました。 ご指摘のあったようにコードを記述しなおし、 コンパイル、リンクしてみたところ、見事ダイアログボックスが出てくれました! 本当にありがとうございます!!!!

その他の回答 (6)

  • usatan2
  • ベストアンサー率37% (163/436)
回答No.7

当方、WinXP 上で BccWin + BCCForm で確認しました。 No6さんと結局は同じですが、 Winmain()の先頭に次の1行を追加すれば動きますよ。 if(LoadLibrary( "RICHED32.DLL" ) == NULL )return 0; ご存知かもしれませんが、BCCでプログラミングするのなら、Visual Windows for BC++(BccWin)が便利で快適ですよ。

参考URL:
http://phys.cool.ne.jp/physjpn/bccwin.htm
HackHack
質問者

お礼

さっそくのご回答ありがとうございます。 記述していただいた、 if(LoadLibrary( "RICHED32.DLL" ) == NULL )return 0; を貼り付け、コンパイル、リンクしてみるときちんとダイアログが表示されました。 本当にありがとうございます!!!!

回答No.5

お疲れ様です。 source.obj source.exe dialog.res この3つを削除された上で、最初からやり直し。 「brc32 dialog.rc source.exe」 の前後でsource.exeの更新日付が変わらないようであれば、おかしいのだと思います。 brc32を使わない方法については暇なときに調査してみます。

HackHack
質問者

お礼

早速のご回答ありがとうございます。 貴重なご意見ありがとうございました。 今後の参考にさせて頂きます!!!!

回答No.4

sourceのコンパイルが出来ていて、リソースファイルのコンパイルが出来ないという事は、環境の問題だと思います。 気になって、googleにて「brc32.exe」で検索してみました。 見てみると「brc32.exe」自体にバグがあり、リンクしてくれないという現象が発生するようです。。。 (参考URLを記載しました。) 貴方の疑問が解けることを祈ります。

参考URL:
http://oshiete1.goo.ne.jp/qa2139137.html
HackHack
質問者

補足

本当ですね。 確かに、brc32 dialog.rc source.exeとタイプしても、 exeファイルのサイズが変わっていません。。。 とにかくお教えいただいた、ilink32の方法でリンクする方法を探してみます。 本当にありがとうございました。

回答No.3

#2です。 手探りでリソースを作っていたため、参照したHPの内容のままでした。 以下の2行は消しても大丈夫そうです。。。 #include <commctrl.h> #include <richedit.h>

HackHack
質問者

補足

本当にお世話になります。 さて、 #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 といエラーが出ました。 お手数かけますが、再度ご教授の方、宜しくお願いします。 本当に申し訳ございません

回答No.2

まず断っておきますが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では目的の事が実行されているようです。 リソースファイルをまともに書いたことは無いので自信はありません。。。

HackHack
質問者

補足

早速のご回答、誠にありがとうございます。 hiro knighさんのおっしゃった通り、 リソースファイルを記述し直して、 brc32 dialog.rc source.exe としたところ、以下のエラーが出ました。 Error dialog.rc 2 11: Cannot open file: commctrl.h と出て、commctrl.hが無いのかな?と調べたんですが、 ありました。 どうして、このヘッダが開けないのかが謎です。。。 なんだか、ちぐはぐなお返事になって申し訳ありません。

  • z64423
  • ベストアンサー率53% (26/49)
回答No.1

デバッガを使って、デバッグしましょう。 > 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() で指定した回数、ビープ音が鳴っていれば、  その位置までは実行していることが分かる。

HackHack
質問者

補足

早速のご回答ありがとうございます。 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文に入らないのでしょうか?? 申し訳ございませんが、ご教授よろしくお願いします。

関連するQ&A