プロが教える店舗&オフィスのセキュリティ対策術

自分は「Borland C++ Compiler 」と「BCC Developer」を使用してCプログラミングを楽しんでいる者です。ビットマップの表示で分からない事があったので、質問させて頂きます。
クライアント領域に表示するビットマップ画像を、リソースから読み込んで表示させようと思ったのですが、

//リソース
//BITMAP

MYBITMAP01 BITMAP "gazou01.bmp"



//ソース
hBmp01 = (HBITMAP)LoadImage(hInst, "MYBITMAP01", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);

の様にして読み込ませてみると、確かに正しく表示されるのですが、読み込むビットマップの数が三つ四つと多くなると、ビルドしている最中に「問題が発生したため、Turbo Incremental Linker を終了します。ご不便をおかけして申し訳ありません。」という、「エラー報告を送信する、送信しない」のウインドウが出てきてしまいます。
BCC Developerの下の欄には「** error 1 ** deleting Debug\Master.exe」という文字が出力されていますが、どういった意味なのかは分かりません。
「現在のプロジェクト構成」という所をReleaseに変えてみたりしたのですが駄目でした。ビルドに失敗すると「TMP1.$$$」というおかしなファイルが作られています。

BCC Developerで、解決の方法や他の多くのビットマップを読み込ませる方法をご存知の方おられたら、回答を宜しくお願いします。

A 回答 (3件)

回答にちょっと間が空いてしまいました。

まだ見てるかな?
久しぶりに自分のPCにBCCやBilderをインストールして試してみようと思ってたのですが、なかなか時間が取れないので、思いついた事だけ書いておきます。
 
リンカの制限は単にRESファイルのサイズの問題ではないみたいですね。本当に単純にビットマップリソースの個数が問題なのかも。今のところ考えうる対策としては
 
1.ビットマップ画像は外部ファイルにする。ただしユーザーから隠すために普通のDIBフォーマットではなく独自のフォーマットにする。DIBセクションを使えばそんなに難しくはない
 
2.リンカが扱える枚数に分割してDLLに分けて格納する。LoadLibraryで実行時にリンクして読み込む
 
3.ビットマップ画像を繋げて1枚にして、ひとつのビットマップリソースとして扱う。(実行時にメモリ食いそうだけど・・・)
 
4.Bilder6などの新しいバージョンのリンカで試してみる
 
5.がんばってVisualC++版に移植して試してみる
 
こんなところでしょうか?
誰かiLink32の制限について既に詳しい人がいれば一番いいんだけど。。。
 
    • good
    • 0
この回答へのお礼

二度目の回答有難う御座います。
VC++無償版をその後使っていき、何とかリソースを読み込ませる事が出来ました。BCCで作ったソースコードも手を加えて少しづつですがビルドしています。なんとか最後までいけそうです。
ある程度慣れてくると、やはりVC++の方がずっと使い易いですね。

お礼は、同じ疑問を持っている人がいたと仮定して、もう少し回答を待ち、それでもなければポイントを付加させて頂きます。

お礼日時:2007/07/02 22:34

エラーメッセージからすると、プログラムの問題ではなくリンカの不具合などで処理を続けられなくなっている感じですね。


ボーランドの別のリンカで、リンク中にメモリ不足になって似た感じのエラーが出た事があります。
 
私は昔、LoadBitmapで20個程度の小さなビットマップをリソースから読み込みましたが、何も問題は起こりませんでした。
ビットマップのサイズが大きすぎてiLinkが扱えるリソースのサイズを超えてしまったという事は考えられないでしょうか?
プログラム内でLoadImageを呼ばなくてもリソーススクリプトにビットマップを追加するだけでリンクエラーになるなら、その可能性が高いと思います。
 
対策としては
・巨大なビットマップはリソースではなく外部の.bmpファイルから読み込むようにする
・Microsoftのフリーのコンパイラ(VisualStudio 2005 Express Edition と Platform SDK)に変えてみる
といった感じでしょうか?
的外れだったらゴメンナサイ。
 
 
ちなみに「** error 1 ** deleting Debug\Master.exe」というメッセージは、「リンクに失敗したのでexeファイルは削除しました」程度の意味なのであまり気にしなくても良いと思います。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
読み込もうとしている画像は440×315ピクセルの画像です。全部で22個、合わせると19MB位ですが、確かにLoadBitmapを使わずただウインドウを作るだけのプログラムに、リソースを付けてビットマップを読み込ませてみても止まってしまいます。
しかし、読み込ませる事が出来なかった画像より、容量のある別の画像は読み込めたりもします。試しに画像を小さくして容量を下げてみると読み込む事が出来ました。しかし、サイズが変わってしまうと困るので出来るだけ元画像サイズの方が好ましいと思っています。(いざとなれば画像を拡大して表示させますが)WAVEやICONは問題なく読み込めます。

>・巨大なビットマップはリソースではなく外部の.bmpファイルから読み込むようにする
・Microsoftのフリーのコンパイラ(VisualStudio 2005 Express Edition と Platform SDK)に変えてみる

元々画像を直接読み込んでいました。しかし、作っているのがゲームなので、初めから画像がプレイヤーに分かってしまうと駄目だろうと思い、リソースからと考えたので、出来ればリソースからと考えています。
VisualStudio 2005 Express Editionは、リソース作成機能もこれ自体には付いていませんし、自分のプログラムはこちらでビルドした物だと、実行してボタンを押したりすると「Run-Time Check Failure #3 - The variable 'Co' is being used without being defined.」と書かれたウインドウが出て、強制終了してしまい、自分が読んでいる「猫でも・・・」の本に書かれているソースなどは文字化けしてしまい、相性が悪い様です。使い慣れているBCCの方で何とかと思っています。

お礼日時:2007/06/29 15:41

★気になった点を1つ。


>hBmp01 = (HBITMAP)LoadImage(hInst, "MYBITMAP01", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
 ↑
 リソースにある『MYBITMAP01』は ID の記号定数ですか?それとも ID 文字列ですか?
 もし、resource.h で定義している記号定数ならダブルクォーテーション文字はつけません。
 つまり、
 hBmp01 = (HBITMAP)LoadImage( hInst, MAKEINTRESOURCE(MYBITMAP01), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR );
 hBmp02 = (HBITMAP)LoadImage( hInst, MAKEINTRESOURCE(MYBITMAP02), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR );
 hBmp03 = (HBITMAP)LoadImage( hInst, MAKEINTRESOURCE(MYBITMAP03), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR );
 となります。
・また、文字列の場合ならばリソースの方にダブルクォーテーション文字を付けます。
 つまり、
 "MYBITMAP01" BITMAP "gazou01.bmp"
 "MYBITMAP02" BITMAP "gazou02.bmp"
 "MYBITMAP03" BITMAP "gazou03.bmp"
 となります。
・よって ID に記号定数か、文字列かで指定が異なります。
 どちらかに統一して下さい。
 あと MAKEINTRESOURCE() マクロ関数で記号定数の ID を文字列化にできます。
 まずは確認と MAKEINTRESOURCE() マクロ関数を使ってみて下さい。
・以上。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
.hの拡張子は確かヘッダファイルという物だと思いますが、それは使っていません。使ってもみましたが、結果は同じでした。(MAKEINTRESOURCEも使用)
ですからリソースの方に""、もやってみましたがエラーとなり駄目でした。(Error Master.rc 8 1: Expecting resource name or resource type name)
折角回答して頂きましたが、いい返信を出来ず申し訳ありません。

書くのを忘れましたが、環境は
Windows XP
メモリ 512+256M

お礼日時:2007/06/28 18:32

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