プロが教えるわが家の防犯対策術!

当方、只今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

//---------------------
// メニューリソース
//---------------------

//---------------------
// イメージリソース
//---------------------

//---------------------
// ストリングテーブル
//---------------------

//--------------------
// アクセラレーター
//--------------------

//------------------
// ヴァージョン情報
//------------------

上記のようになってます。
どうかご教授の方、宜しくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

さっそくのご回答ありがとうございます。
記述していただいた、

if(LoadLibrary( "RICHED32.DLL" ) == NULL )return 0;

を貼り付け、コンパイル、リンクしてみるときちんとダイアログが表示されました。

本当にありがとうございます!!!!

お礼日時:2009/11/03 19:27

こんにちは。



当方、「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
=========================
※当方は↑このコマンドで問題なくコンパイル&リンクできました。

以上です。参考になれば幸いです。
    • good
    • 0
この回答へのお礼

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

本当にありがとうございます!!!!

お礼日時:2009/11/03 19:21

お疲れ様です。



source.obj
source.exe
dialog.res

この3つを削除された上で、最初からやり直し。
「brc32 dialog.rc source.exe」
の前後でsource.exeの更新日付が変わらないようであれば、おかしいのだと思います。

brc32を使わない方法については暇なときに調査してみます。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

貴重なご意見ありがとうございました。

今後の参考にさせて頂きます!!!!

お礼日時:2009/11/03 19:29

sourceのコンパイルが出来ていて、リソースファイルのコンパイルが出来ないという事は、環境の問題だと思います。



気になって、googleにて「brc32.exe」で検索してみました。

見てみると「brc32.exe」自体にバグがあり、リンクしてくれないという現象が発生するようです。。。
(参考URLを記載しました。)

貴方の疑問が解けることを祈ります。

参考URL:http://oshiete1.goo.ne.jp/qa2139137.html

この回答への補足

本当ですね。
確かに、brc32 dialog.rc source.exeとタイプしても、
exeファイルのサイズが変わっていません。。。

とにかくお教えいただいた、ilink32の方法でリンクする方法を探してみます。

本当にありがとうございました。

補足日時:2009/11/02 16:45
    • good
    • 0

#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

といエラーが出ました。
お手数かけますが、再度ご教授の方、宜しくお願いします。
本当に申し訳ございません

補足日時:2009/11/02 04:18
    • good
    • 0

まず断っておきますが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が無いのかな?と調べたんですが、
ありました。
どうして、このヘッダが開けないのかが謎です。。。

なんだか、ちぐはぐなお返事になって申し訳ありません。

補足日時:2009/11/02 00:51
    • good
    • 0

デバッガを使って、デバッグしましょう。




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

補足日時:2009/11/02 00:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!