• 締切済み

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アプリケーションではありません」とのこと 参考にしているサイトどちらのソースも同じ状況になります・・・ 分かる方指摘の方お願いします

みんなの回答

noname#144013
noname#144013
回答No.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;   --以降変更なし--       : =================================

noname#144013
noname#144013
回答No.2

こんにちは。 コンパイル時または、リソースファイルとの結合時、及びリンク時に何かしらの エラー(または、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  ←ソース名(拡張子なし)を指定 以上です。

oremoiki-
質問者

お礼

詳しい解説ありがとうございます さっそく、書いていただいたソースとバッチファイルで実行してみたのですが コンパイルは問題なくでき(warning等も表示はされず)、生成されたexeファイルも 実行はできるのですが、やはりメニューは表示されず・・・ あらためて環境変数やcfgファイルの中身を確認してみたものの不審な点も見当たらず・・・ もうすこし考えてみようと思います。

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

直接の回答ではありませんが、 BccWin + BccForm を活用されたらメニュー表示が簡単に作れますよ。 <準備> BccWinをインストール BccFormを解凍 BccWin起動 オプション - ツール設定 で BccForm を登録 <利用> ファイル - 新規 - 新規プロジェクト - ウインドウズ型 新規プロジェクトを作成 にチェック ファイル作成 - C言語ソースファイルに「form.c」- OK ビルドボタン、実行ボタン で Hello のフォームが完成。   <画面の設計> ツール - BCCForm でリソースエディタを起動する リソースタイプの「ダイヤログ」の行をクリックすると、画面が出る。  四角を書くとボタンが出来る(デフォルト) 右クリックで「コントロールの追加」で追加する

関連するQ&A