当方、只今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
//---------------------
// メニューリソース
//---------------------
//---------------------
// イメージリソース
//---------------------
//---------------------
// ストリングテーブル
//---------------------
//--------------------
// アクセラレーター
//--------------------
//------------------
// ヴァージョン情報
//------------------
上記のようになってます。
どうかご教授の方、宜しくお願いします。
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
さっそくのご回答ありがとうございます。
記述していただいた、
if(LoadLibrary( "RICHED32.DLL" ) == NULL )return 0;
を貼り付け、コンパイル、リンクしてみるときちんとダイアログが表示されました。
本当にありがとうございます!!!!
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
=========================
※当方は↑このコマンドで問題なくコンパイル&リンクできました。
以上です。参考になれば幸いです。
さっそくのご回答ありがとうございました。
ご指摘のあったようにコードを記述しなおし、
コンパイル、リンクしてみたところ、見事ダイアログボックスが出てくれました!
本当にありがとうございます!!!!
No.4
- 回答日時:
sourceのコンパイルが出来ていて、リソースファイルのコンパイルが出来ないという事は、環境の問題だと思います。
気になって、googleにて「brc32.exe」で検索してみました。
見てみると「brc32.exe」自体にバグがあり、リンクしてくれないという現象が発生するようです。。。
(参考URLを記載しました。)
貴方の疑問が解けることを祈ります。
参考URL:http://oshiete1.goo.ne.jp/qa2139137.html
この回答への補足
本当ですね。
確かに、brc32 dialog.rc source.exeとタイプしても、
exeファイルのサイズが変わっていません。。。
とにかくお教えいただいた、ilink32の方法でリンクする方法を探してみます。
本当にありがとうございました。
No.3
- 回答日時:
#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
といエラーが出ました。
お手数かけますが、再度ご教授の方、宜しくお願いします。
本当に申し訳ございません
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では目的の事が実行されているようです。
リソースファイルをまともに書いたことは無いので自信はありません。。。
この回答への補足
早速のご回答、誠にありがとうございます。
hiro knighさんのおっしゃった通り、
リソースファイルを記述し直して、
brc32 dialog.rc source.exe
としたところ、以下のエラーが出ました。
Error dialog.rc 2 11: Cannot open file: commctrl.h
と出て、commctrl.hが無いのかな?と調べたんですが、
ありました。
どうして、このヘッダが開けないのかが謎です。。。
なんだか、ちぐはぐなお返事になって申し訳ありません。
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() で指定した回数、ビープ音が鳴っていれば、
その位置までは実行していることが分かる。
この回答への補足
早速のご回答ありがとうございます。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) コマンドプロンプトでフォルダ内(デスクトップ)の複数PDFファイルの1ページ目だけを印刷したい 1 2022/09/11 23:33
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
1 つ以上の複数回定義されてい...
-
” OS ビルド ” の意味が分か...
-
<math.h>があるのにsqrtが・...
-
「fatal error C1189」を回避す...
-
必要なDBG ファイルが見つから...
-
Makefile作成時の拡張子.oとは?
-
動的な変数名のつけ方について
-
Microsoft の Visual C++ サン...
-
外部シンボル "_main"は未解決です
-
クリティカルエラー Expressio...
-
2G以上のファイル操作
-
Borland C Builder とOpenCVを...
-
C++/CLIで、アンマネージC++のD...
-
アプリケーションの配布
-
VC60とVC70の違いは?
-
VMwareのLinuxでコンパイルでき...
-
複数のサブディレクトリを一緒...
-
コンパイルエラー
-
NOTIFYICONDATAについて
マンスリーランキングこのカテゴリの人気マンスリー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
おすすめ情報