みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

win32api c言語 メニュー表示 リソース

Borland C++ Compiler 5.1.1を使ってwindowsプログラミングを
しているのですがメニューの表示ができません

参考にしているページ
http://wisdom.sakura.ne.jp/system/winapi/win32/win76.html
http://www.geocities.jp/ky_webid/win32c/028.html

ソースはまるまるコピーしているので
exeファイルの生成から実行、ウィンドウの表示までは問題ないです

brc32 xxx.rc xxx.exe
と指定してもexeファイルには変化が無く(tdumpで確認してもresource欄に変化なし)
.RESファイルが作成されるのみで
exeファイルを実行してもメニュー表示はありませんでした

続いて(先ほど生成されたファイルは一旦削除)
bcc32 -c -W xxx.c
brcc32 xxx.rc
ilink32 xxx.obj, , , , ,xxx.RES
としてみたところexeファイルに変化があり
その他ilc ild ilf ils map tdsといったファイルも同時に生成されました
ですが実行してみたところ「有効なwin32アプリケーションではありません」とのこと

参考にしているサイトどちらのソースも同じ状況になります・・・
分かる方指摘の方お願いします

投稿日時 - 2011-02-11 13:30:48

QNo.6514389

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

こんにちは。 #2です。

プログラムの不具合の原因が中々掴めないような場合は、プログラムの動作が、
  『何処まで正常か』 or 『何処で失敗しているか』
を見極める作業(デバッグ)が必要だと思います。

そのためには、実行時の特定データあるいは、関数の戻り値などをチェックし、
正常or異常を細かく見ていくしかないと思います。

手始めに、#2のプログラムで言えば、WinAPIのLoadMenu()、SetMenu()あたり
が怪しそうなので、これらの関数の戻り値がどうなっているかを見ることから始
めた方が良いかもしれません。

以下は、#2のプログラムに戻り値チェックを追加したサンプルです。
この辺りから検証してみて下さい。

■LoadMenu()、及び、SetMenu()の戻り値チェック挿入部分
注)下記サンプルでは、インデントに全角スペースを入れています。
  使用する際は半角スペースorタブに置換して下さい。
=================================
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
  static HMENU hMenu;
  LPVOID lpMsgBuf = NULL; //※メッセージ用
  BOOL bRes; //※戻り値用

  switch( msg )
  {
  case WM_CREATE:    //ウィンドウが作られたとき
    //メニューリソースをロードする
    hMenu = LoadMenu( NULL, _T("IDR_MENU") );

    //※戻り値チェック
    if(hMenu==NULL){
      //エラーメッセージ表示
      FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR)&lpMsgBuf, 0, NULL );
      MessageBox( NULL, lpMsgBuf, _T("GetLastError: LoadMenu()"),
        MB_OK | MB_ICONINFORMATION );
      LocalFree( lpMsgBuf );
      lpMsgBuf = NULL;
    }
    else{
      //成功メッセージ表示
      MessageBox( NULL, _T("LoadMenu()は成功しました。"),
        _T("LoadMenu()"), MB_OK | MB_ICONINFORMATION );
    }

    //ウィンドウにメニューリソースを割り当てる
    bRes = SetMenu( hWnd, hMenu );

    //※戻り値チェック
    if(bRes==FALSE){
      //エラーメッセージ表示
      FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR)&lpMsgBuf, 0, NULL );
      MessageBox( NULL, lpMsgBuf, _T("GetLastError: SetMenu()"),
        MB_OK | MB_ICONINFORMATION );
      LocalFree( lpMsgBuf );
      lpMsgBuf = NULL;
    }
    else{
      //成功メッセージ表示
      MessageBox( NULL, _T("SetMenu()は成功しました。"),
        _T("SetMenu()"), MB_OK | MB_ICONINFORMATION );
    }
    return 0;

  --以降変更なし--
      :
=================================

投稿日時 - 2011-02-13 05:31:30

こんにちは。

コンパイル時または、リソースファイルとの結合時、及びリンク時に何かしらの
エラー(または、warning)は出ていないでしょうか?

念のため、ご使用の環境での、bcc32.exe等のユーティリティへのパス設定、
及び、インクルードファイル&ライブラリファイルのパス設定が正しく設定され
ているかどうかを確認された方が良いかもしれません。

※もしも、BCC以外の開発環境(VC++、MinGW、Cygwin等)を共存させている
 場合は、それらの環境設定の状態(参照パスの優先度、競合等)により、
 ビルド作業時(実行ファイル生成)や、実行ファイルの実行時に問題が発生
 する可能性があります。

当方の環境(BCC5.5.1)で、以下のソースファイル及び、バッチファイルを使用
してビルド作業を行ったところ、正常に実行ファイルが作成され、実行時も問題
なく動作し、メニュー表示等が行われました。

ですので、宜しければ質問者さんの環境でも、以下のファイルを使用して検証
してみて下さい。

■ソースファイル
1)リソーススクリプト

ファイル名: "Test1.rc"
========================================
#include "resource.h"
/*リソーススクリプト*/
IDR_MENU MENU {
POPUP "FILE(&F)" {
MENUITEM "開く(&O)" , ID_FILE
MENUITEM "終了(&X)" , ID_EXIT
}
POPUP "HELP(&H)" {
MENUITEM "ヘルプ表示(&P)" , ID_HELP
MENUITEM "バージョン情報(&V)" , ID_VERSION
}
}
========================================

2)リソース用ヘッダファイル

ファイル名: "resource.h"
========================================
#define ID_FILE 0
#define ID_EXIT 1
#define ID_HELP 2
#define ID_VERSION 3
========================================

3)メインプログラムソース
・ご提示の下記参考サイトのページの2番目(下の方)のソースを、そのまま
 使用させて頂きました。
・ファイル名は、"Test1.c" とします。

◎Win32API(C言語)編 第28章 メニューバーを作る
http://www.geocities.jp/ky_webid/win32c/028.html

■実行ファイル作成用バッチファイル
・下記のバッチファイルを使用しビルドを行いました。
・上記のソースファイルと下記のバッチファイルは、全て同一フォルダに置いて
 下さい。
・1)で上手くいかなかった場合は、2)の方で試してみて下さい。

注)リソーススクリプトのファイル名と、メインプログラムソースのファイル名は
  拡張子を除いて同じにして下さい。

1)デフォルト設定を利用するバージョン

ファイル名: "make1.bat"
========================================
bcc32 -W -w-8057 %1.c
brc32 %1.rc %1.exe
========================================
<使用例>
**> make1 Test1  ←ソース名(拡張子なし)を指定

2)インクルード&ライブラリのパス等のオプション指定バージョン
・下記バッチファイルの『インクルードパス』、及び、『ライブラリパス』は、
 ご使用の環境に合わせて変更して下さい。

ファイル名: "make2.bat"
===========================================================
bcc32 -IC:\borland\bcc55\Include -LC:\borland\bcc55\Lib -W -w- %1.c
brc32 -iC:\borland\bcc55\Include -x -32 -V4.0 %1.rc %1.exe
===========================================================
<使用例>
**> make2 Test1  ←ソース名(拡張子なし)を指定

以上です。

投稿日時 - 2011-02-12 15:01:11

お礼

詳しい解説ありがとうございます
さっそく、書いていただいたソースとバッチファイルで実行してみたのですが
コンパイルは問題なくでき(warning等も表示はされず)、生成されたexeファイルも
実行はできるのですが、やはりメニューは表示されず・・・

あらためて環境変数やcfgファイルの中身を確認してみたものの不審な点も見当たらず・・・
もうすこし考えてみようと思います。

投稿日時 - 2011-02-12 18:58:37

ANo.1

直接の回答ではありませんが、
BccWin + BccForm を活用されたらメニュー表示が簡単に作れますよ。

<準備>
BccWinをインストール
BccFormを解凍

BccWin起動
オプション - ツール設定 で BccForm を登録

<利用>
ファイル - 新規 - 新規プロジェクト - ウインドウズ型
新規プロジェクトを作成 にチェック
ファイル作成 - C言語ソースファイルに「form.c」- OK

ビルドボタン、実行ボタン で Hello のフォームが完成。
 
<画面の設計>
ツール - BCCForm でリソースエディタを起動する
リソースタイプの「ダイヤログ」の行をクリックすると、画面が出る。
 四角を書くとボタンが出来る(デフォルト)
右クリックで「コントロールの追加」で追加する

投稿日時 - 2011-02-12 01:12:35

あなたにオススメの質問