• 締切済み

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

  • Win32APIとC言語を使ってビットマップを表示したいのですが、表示できません。

    小生、只今Win32APIとC言語を使い、WindowsXPSP3上でBCC5.5.1とBCCFormを使いビットマップを表示するプログラムを書いていますが、 "猫でもわかるWindows~"などに掲載されているサンプルを実行してみますが、ビットマップが表示されません。 ウィンドウクラスの登録、ウィンドウの生成などはほぼ、 http://gurigumi.s349.xrea.com/programming/visualcpp/intro4.html に掲載されている、サンプルプログラムと同じです。 違いと言うと、ResBitmap.hをインクルードしているくらいです。 問題はウィンドウプロシージャにあって、 下記にウィンドウプロシージャ、WndProc関数を記します。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc, hdc_mem; PAINTSTRUCT ps; HBITMAP hBmp; BITMAP bmp_info; static int w, h; switch(msg){ case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hBmp = LoadBitmap(hInst, "MYBMP"); if(hBmp == NULL){ MessageBox(hWnd, "ビットマップ読み込み失敗", NULL, MB_OK); return 0; } GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem, hBmp); BitBlt(hdc, 0, 0, w, h, hdc_mem, 0, 0, SRCCOPY); DeleteDC(hdc_mem); DeleteObject(hBmp); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return 0; } return DefWindowProc(hWnd, msg, wp, lp); } この状態で実行ファイルを、 bcc32 -W source.cpp brc32 Bitmap.rc source.exe とし、出来上がったsource.exeを実行すると"ビットマップ読み込み失敗"のメッセージボックスが表示されてしまい、ウィンドウには何も表示されません。 ちなみに、Bitmap.rcは下記の様になってます。 MYBMP BITMAP DISCARDABLE "C:\Documents and Settings\ShuNakagawa\My Documents\C\test.bmp" ResBitmap.hは下記の様になってます。 #define MYBMP 100 以上です。 諸先輩方、アドバイス宜しくお願い致します。 もう悩んで2ヶ月程経ちます、どうか本当に助けてください。 ※LoadBitmapの第2引数をMAKEINTRESOURCE(MYBMP)とし、  実行ファイルを作成しましたが、結果は同じでした。。。

  • C++ リソースファイルの使い方について

    うまく説明できていないかもしれませんが AAA.exeとBBB.exeとBBB.exeを実行するために必要なファイル(以後 CCC.dll)があり、 AAA.exeの中にBBB.exeとCCC.dllを埋め込み AAAexeを実行時にCCC.dllをsystem32フォルダの中に置き、その後BBB.exeを実行させたいのですが、埋め込んだファイルの抽出方法が見つかりません。 どなたか、抽出ソースの書き方、またはよいサイトをご存じでしたら教えていただけないでしょうか?

  • C言語での実行

    C言語(ボーランドのCpad)を使っています。 いつも使ってるパソコンと違うパソコンでC言語のプログラムをし始めました。 前のパソコンと同じようにプログラムのコードをCファイルで保存して同じように新しいパソコンから開いて同じように実行ボタン押したのですが、実行できず、exeファイルが存在しませんって表示されます。 ちなみに、動かすプログラムは4つあり、そのうちの3つはちゃんと実行でき、ファイルも作成できるのですが、同じ方法でやってるあと1つのプログラムだけがうまくいきません。 4つとも同じフォルダにするようにしていて、3つはちゃんと実行できるので、フォルダが違うことはないと思います。 なぜ「exeファイルが存在しません」ってなるのか。 ちゃんとフォルダにCファイルはあるのに。 ちなみに、正確にできる3つのように、実行できると「OBJファイル」とか「アプリケーション」とかも同時に作成されます。 ただ、問題の1つのプログラムは当然、実行できず、exeファイルが存在しませんって表示されるので何も作成されません。 ボーランドのC言語、実行、ファイル、など詳しい方ぜひ教えて下さい。 同じやり方で今までのパソコンではできていたのに、パソコン変えると実行できなくなります。 フォルダやCファイルが正確ではないのかとも思いましたが、前までのパソコン通りにやっているので問題ないと思います。 ぜひアドバイス下さい。

  • WIN32APIとかC++のコンパイルについて

    http://www.geocities.jp/ky_webid/win32c/001.html のメッセージボックスに表示させるというプログラムソースをコピペして、コマンドからコンパイルしたら、 C:\study>cl wintest1.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. wintest1.c Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. /out:wintest1.exe wintest1.obj wintest1.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 _WinMain@16 で参照されました。 wintest1.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と、怒られてしまったのですが、どの様にすればいいのでしょうか?

  • Visual C++でC言語の基礎学習

    Visual C++を使ったC言語についての質問です。 (アプリケーションの作成ではなく、コマンドプロンプト上で起動する基礎的な文法の学習です) Win32コンソール プロジェクトを作成し、そのプロジェクトの中でCのソースファイルを作成して実行確認をしようと思っています。 プロジェクト内のソースファイルが1つだけだと正常にビルドできますが、2つ以上のソースファイルを作成してビルドすると 「1 つ以上の複数回定義されているシンボルが見つかりました。」 というエラーがでてしまい、実行することができません。 新たにWin32コンソール プロジェクトを作成し、その中でソースファイルを作成しなければ実行できないのでしょうか? よろしくお願いします。

  • リソースの表示方法

    アイコンのリソースの表示の仕方を教えてください。 1 http://wisdom.sakura.ne.jp/system/winapi/win32/win72.html   の一番上ソースをコンパイル、メイクする。 2 KITTY ICON DISCARDABLE "test.ico" をメモ帳に書き   a.rcで保存。 3 test.ico  画像ファイルを用意する。 1でコンパイル、で出来たフォルダに、a.rc、 test.ico をいれ、またコンパイル、などをする。 これで完成のはずですが、うまくいきません。 やり方を教えてください。 borland のコンパイラ、BCC Developer を使います。

  • C言語を始めよう!

    C言語を始めよう! http://www.forest.impress.co.jp/article/2002/10/24/cwohajimeyou.html を使用しています。 NT4/2000/XP で、16 ビットプログラムの実行結果が表示されない  と言う問題は、LSI C-86 Ver.3.30c 試食版をツールを利用して実行するプログラム共通の問題のようです。  CPad for LSI C-86でも、以下のとおり、同様の問題があり、 COMMAND  プログラムで、この問題を解決しようとしています。 phb1122  でも、以前は、 COMMAND を利用した形跡があります。今は、 PIF ファイルを作成 することで解決しています。  なぜ、このような経緯になったのか詳しく解説していただけませんでしょうか? ******************************* WindowsNT/2000上の CPad for LSI C-86 で、コンパイルはできるが、実行結果が表示されない これは LSI C-86 が16ビットアプリケーションであるために起こる現象です。 解決策は、作成した実行ファイルを実行する前に一度、Windows9xとの互換性のために用意されているcommand.comを実行することで回避できます。 CPad での設定方法は、 [設定]ダイアログ-[高度な設定]ページの[以下の設定を変更する(C)]にチェックをしてから、[実行するコマンド(B)]に %WINDIR%\system32\command.com /c exit > nul と記述して[OK]ボタンをクリックします。 これでNT/2000上でも LSI C-86で作成した実行ファイルの出力を確認できます。 また、この現象が起こらない場合もあるようですが、どういう環境で起こって、どういう環境で起こらないのかははっきりわかっていません。 *********************** C:\phb1122\phoebe.htm ★ NT4/2000/XP で、16 ビットプログラムの実行結果が表示されない場合について Windows NT4/2000/XP で、LSI C-86 試食版を使って 16 ビットプログラムを作成して実行した際に、出力結果が表示されず、空欄になってしまう場合があります。この現象についていろいろ調査してみましたが、NTVDM.EXE の動作に原因がありそうというだけで、それ以上がどうしても分かりません。しかし、強制的に MS-DOS プロンプトを起動させられればうまくいくのではと考え、PIF ファイルを作成し、それを介して実行することで、とりあえず出力結果を表示させることに成功しました。メニューの「ビルド(B)」→「PIF を作成して実行(I)」をチェックすることで設定できます。このメニューは、LSI C-86 試食版をコンパイラに設定しているときのみ有効です。 敬具

  • C言語、成績は4194432?

    いつも大変お世話になり誠にありがとうございます。 標記の件。 おかしな実行結果になりました。 どうしてでしょうか? ご回答の程宜しくお願い申し上げます。       記 コード #include <stdio.h> int main(void) { int res; printf("成績を入力してください。\n"); scanf("%d", &res); printf("成績は%dです。\n", res); switch(res){ case 1: printf("もっとがんばりましょう。\n"); break; case 2: printf("もう少しがんばりましょう。\n"); break; case 3: printf("さらに上をめざしましょう。\n"); break; case 4: printf("たいへんよくできました。\n"); break; case 5: printf("たいへん優秀です。\n"); break; } return 0; } 実行結果 C:\MinGW>test20.exe 成績を入力してください。 A 成績は4194432です。 C:\MinGW>test20.exe 成績を入力してください。 b 成績は4194432です。 C:\MinGW>test20.exe 成績を入力してください。 v 成績は4194432です。 度々申し訳ございません。 ご回答の程宜しくお願い申し上げます。

  • C/C++ Win32 プロジェクト で簡単なゲームを作って言います。

    C/C++ Win32 プロジェクト で簡単なゲームを作って言います。 ・.cppファイルはひとつです。 ・#include "DxLib.h" DXライブラリを使用させていただいてます。 プログラムが完成したら.cppファイルをMicrosoft VisualC++ 2010 のメニューバーの 「ファイル」→名前をつけて保存で.exeファイルで保存をして、exeファイルを起動させたのですが、 なにやら、英語でなんか出てきて起動できません。 どうやったら機動できるのでしょうか??? できれば、すぐに答えがほしいです。

  • microsoft visual C++ でC言語のプログラミング

    プログラミングの超初心者です。 microsoft visual C++ 6.0を利用してC言語のプログラミングをしたいのですが,最も基本のhello worldを表示させようとしてビルドを行うと以下のようなエラーが表示されますが,解決法がわかりません. --------------------構成: hello1 - Win32 Debug-------------------- リンク中... LINK : fatal error LNK1104: ファイル "Debug/hello1.exe" を開けません。 link.exe の実行エラー hello1.exe - エラー 1、警告 0 解決法を教えていただけるとうれしいです. お願い致します.

専門家に質問してみよう