リソース - みる会図書館


検索対象: Inside Visual C++
118件見つかりました。

1. Inside Visual C++

26 章ダイナミックリンクライプラリ (DLL) デフォルト動作 ( 前の節で説明した DLL 初期化関数を書いたと仮定する ) では、リソースを次の順 ース 番で検索する。 1. 2. 3. クライアントアプリケーションのリソ 拡張 DLL の独自のリソース MFC200 の標準 AFX リソース 要な場合は標準 AFX リソースをオーバーライドすることもできる。 ムワークは MFC200. DLL のリソースの前にクライアントのリソースを検索するので、必 トといった ) 多くの文字列リソース定義を除去することができる。アプリケーションフレー さらに VisuaIWorkbench のエデイタを使って ( [ ファイル ] や [ 編集 ] メニューのプロンプ #include "afxprint . rc" #include "afxres . の行を削除すればよい。 から [ インクルードファイルの設定 ] を選択し、次にリソーススクリプトファイルから以下 ロジェクトの RC ファイルを重複して持っ必要はない。 AppStudio の [ ファイル ] メニュー 注意 MFC200. DLL は標準 AFX リソースを収めているので、 AppWizard が生成したプ DLL のリソースを最初に検索するように強制すれば、デフォルトの検索動作を変更できる。以下 のコードではリソースにアクセスして、アプリケーションフレームワークのインスタンスハンドル をクライアントアプリケーションから DLL に切り換え、次にインスタンスハンドルを切り換えて クライアントアプリケーションに戻している。 HINSTANCE hInstResourceC1ient = AfxGetResourceHand1e ( ) ; AfxSetResourceHandIe (extensionDLL . hModuIe) ; strError. LoadString(IDS—ERRORI) ; AfxSetResourceHandIe (hInstResourceCIient) ; 0 インラインコンストラクタ / / ューザー DLL の / / インスタンスハンドル / / クライアントの / / インスタンスハンドルに復旧 DLL に収容するクラスにはインラインコンストラクタを使ってはいけない。 ラクタは、クラスのメンバ関数のェクスポート処理を複雑にする。 0 拡張 DLL の工クスポート インラインコンスト 拡張 DLL の特定の関数と変数は、特別に「エクスポート」されなければならない。どれをェクス ポートするのか ? これは生成されているオプジェクトが、 DLL 中のクラスによるものか、あるい は DLL 中のクラスから派生させたクラスによるものかに依存する。以下にいくっかの規則を示す。 557

2. Inside Visual C++

PART 2 クラスライプラリピュークラス 情報 < ファイルを開く > ダイアログボックス中でプロジェクトの RC ファイルを選択す ることでも、 App Studio を起動することができる。これができるようにするには、ます VisuaIWorkbench の [ オプション ] メニューから [ 工デイタ ] を選択し、 < 工デイタの設 定 > ダイアログボックス中の [. RC ファイルを開く時に App Studio を起動 ] チェックポッ クスをチェックする。 2. アプリケーションのリソースを調べる。こで、個々のリソースを探索するのに多少の時間をさ こう。リソースの選択は 2 段階の処理からなることに注意。最初に、左側の < リソースの種類 > をクリックし、次に右の特定のリソースをダブルクリックする。リソースを選択すると、選択さ れたリソース用の適切なツールを持った別のウインドウがオープンする ( コントロールバレット もオープンする ) 。 3. くバージョン情報 > ダイアログボックスを変更する。 AppStudio 中で以下に示すように、 < バー ジョン情報 > ダイアログボックスに関して多少の変更を行なう。 方 1- ル旧編集旧リソ - ス ( ) しイ門トⅢウイ ) ド、ウ ( 勾げ ( 旦 ) 0 の 2 新・ 1 の、爪 ーロ曲 9 ア印ゞテ 一般 社アン ( 0 : EX03A のバージョン メコイ M ) : ) わト名 : S 対師 フわトサイで : 3422 21 - 5 右と下の境界をドラッグしてウインドウのサイズを変更、 [ OK ] ボタンの移動、テキストの変更 などを行なうことができる。要素を選択するためには、単にクリックすればよい。完了したら、 ファイルをセープし AppStudio を終了する。 4. 変更されたソースファイルでアプリケーションをビルドする。 VisuaIWorkbench 中で [ プロ ジェクト ] メニュー中から [ ビルド ] を選択する。 C 十十の再コンパイル、リンクは実際には必要 ないことに注意。 Visual Workbench は編集されたリソースファイルをディスクにセープし、 その後リソースコンパイラ (RC. EXE) が EX03A. RC を処理し、コンパイル済みバージョンの EX03A. RES を生成する。コンパイルされたリソースを EX03A. EXE ファイルにバインドする ために RC. EXE が再度実行され、それまであった古いのリソースを置き換える。 い蔔篳翩住耳印崩に一 EX03A のバージョン EX03A A 叩 lication Version 1. ロ Copyright (C) 1 994 60

3. Inside Visual C++

目 次 CMD/He/pWnd ・・ CS び / カ g / / とル・ CHexView ・ 必要なリソース・ 必要なヘルプファイル・・ アプリケーションをビルド、テストする・ 2 1 章実践的な Windows べースのアプリケー MATPLAN アプリケーション・・ MATPLAN アプリケーションの分析・ C ル 1atp/anApp ・ C ル 1ainFrame ・ CMD/Specia/Chi/dWnd ・ CPiece ・ CMatp/anDia/og ・ CListView ・ CP/anView ・ MATPLAN のリソースファイル・・ ヘッダファイル・ MATPLAN アプリケーションのビルドとテスト・ PART 4 上級的なトピックス ション 22 章ドキュメント、ビューを持たない Microsoft 基本クラスライプラリ 例 EX 22A— S 団アプリケーション・・ バージョン 2 .0 プログラム CEx22aApp ・ C ル 1ainFrame ・ 必要なリソース・ 例 EX22B ーー - ダイアログをベースにしたアプリケー C ど X22 わ pp ・・ C ど X22 わ D 后 / og ・ 必要なリソース・ 例 EX22C ーー M 団アプリケ CEx22cApp ・ CMainFrame ・ CChi/dFrame ・ 必要なリソース・ 20 ーション・ ション・ ・・ 407 ・・ 408 ・・ 409 ・・ 409 ・・・ 409 ・・ 410 411 ・・・ 412 ・・ 413 ・・・ 414 ・・ 414 ・・ 415 ・・・ 416 ・・ 419 ・・・ 421 ・・・ 426 ・・・ 432 ・・ 433 ・・ 434 437 ・・ 437 ・・・ 440 ・・ 441 ・・ 442 ・・・ 442 ・・・ 445 ・・・ 445 ・・ 446 ・・ 446 ・・・ 451 ・・ 451 ・・ 452 ・・ 453

4. Inside Visual C++

1 章 Microsoft Windows と VisuaI C 十十 0 リソースペースのプログラミング MS - DOS でデータ駆動型プログラミングを行なうには、データを初期化された定数としてプロ グラム中に書くか、プログラムで読み込むために別のデータファイルを用意しなければならない。 Windows 用にプログラムするときは、何種類かのフォーマットを使用して、データをリソースファ イルに格納しておく。 Windows は「バインド」と呼ばれる処理を通して、リソースファイルをリン ク済みのプログラムにマージする。リソースファイルは、ビットマップ、アイコン、メニュー定義、 ダイアログボックスのレイアウト、文字列を収めることができる。さらに、これにはプログラマが 定義したカスタムリソースフォーマットをも含めることができる。 プログラムはテキストエデイタを使用して編集するが、リソースを編集するには、一般に「 what you see is what you get 」 (wysiwyg) ツールを使用する。たとえばダイアログボックスをレイアウ トするときは、マウスを使って、コントロールバレットと呼ばれるアイコン配列から要素を選び、ポ タンやリストボックスの位置と大きさを決めていく。 Visual C 十十の App Studio リソースエディ タブログラムを使えば、ほとんどのリソースフォーマットを効果的に編集できる ( 注 : Microsoft VisuaI Basic と Microsoft Access では、コントロールバレットはツールポックスと呼ばれてい 0 メモリ管理 かっては、 MS ー DOS のコンべンショナルメモリの 640 キロバイト ( KB ) の制限が、プログラムの サイズを制限していた。より大きなプログラムを実行するためには、各種オーバーレイ管理テクニッ クや、 EMS/XMS メモリマネージャを使うこともできたが、どれも何らかの短所がある。 80386SX べース ( あるいはそれ以上 ) のコンピュータはたいてい 4MB 以上のメモリを持っており、 CPU は組 み込みのメモリ管理ハードウェアを持っている。 Windows は Visual C 十十コンパイラと共に、付 加的なメモリ管理機能を提供する。結局のところ、もはやメモリの問題はそれほど大きなものでは なくなった。 第 9 章では、現在の Windows 用のメモリ管理テクニックを解説している。ロッキングメモリハ ンドル、サンク、バーガーマスターにまつわる恐ろしい話を聞いたことがあったとしても、心配は いらない。これらはすべて過去のことだ。今日、必要とするメモリは単純に割り当てられ、細かい 部分は Windows が面倒をみてくれる。プログラムはリソースを含めて、部分的にディスクとの間 でスワップされ、物理メモリ中で切り混ぜられるが、コンピュータが十分な容量のメモリを持って いれば、プログラム全体が物理メモリ中に収まる場合もある。 0 ダイナミックリンクライプラリ (DLL) MS-DOS 環境では、プログラムのすべてのオプジェクトモジュールは、作成処理時にスタティッ クにリンクされていた。 Windows はダイナミックリンキングが可能で、これは実行時に特別に作 29

5. Inside Visual C++

3 章 AppWizard で始める「 He110 world! 」 以上に示したリソースに加え、 EX03A. RC は次の文を含んでいる。 #include "afxres . h" むためのものである。これらは、文字列、グラフィカルボタン、印刷と OLE に必要な要素といっ これはすべてのアプリケーションに共通するいくつの特別なクラスライプラリリソースを取り込 #include "resource . EX03A. RC はまた、次の文を収めている。 た、特別なリソースである。 識別する ) 、および IDD-ABOUTBOX ( < バージョン情報 > ダイアログボックスを識別する ) 、といっ この文は、 / の一 M / ル F. ス ME ( メニュー、アイコン、文字列リスト、アクセラレータテープルを 新豊第露 方イル旧編集旧リソース ( R ) ウイ ) ド、ウ ()d ) 勾げ ( 旦 ) Studio] を選択する。次のような App Studio のウインドウが現われる。 1. App Studi0 プログラムを起動する。 Visual Workbench 中で、 [ ツール ] メニューから CApp VisuaI Workbench 内から実行するのが一番簡単である。 AppStudio は Windows のファイルマネージャかプログラムマネージャからも実行できるが、 ÄApp Studio の実行 Studio が編集しないリソースが収められる。バージョンリソースはこちらに収められる。 注意プロジェクトのリソースディレクトリ中に位置するファイル EX03A. RC2 には、 App 独自の定数を追加するためにテキストエデイタを使った場合、 AppStudio はこれを排除しない。 Studio を使った場合、その定義は最終的に RESOURCE. H に反映される。もし RESOURCE. H に のソースコードファイルからも間接的にインクルードされる。定数 ( シンポル ) を追加するために App た # d ア尾定数をアプリケーションに導入する。この RESOURCE. H ファイルはアプリケーション リ屮スの種類 Acce 「計 0 「 8 加叩 に on Menu S 叩 Table Üialoq 当ナス : 新旧 D ABOUTBOX ( 合計 1 ) 59

6. Inside Visual C++

26 章ダイナミックリンクライプラリ (DLL) 例 EX26A のビルドがすべてうまくいっていれば、 EX26AD のインポートライプラリと DLL は 使用可能になる。 EX26B クライアントアプリケーションをビルド、実行することができる。出力は 次の Figure26 ー 2 に示したようなものになる。 Wlndows アリーション EX26B ー APÅ.STIJ 方イル旧編集旧表示 ( Y ) 勾げ ( 旦 ) eghers, J0hn McCro 「 Dean inofsky, Steve Meyers, Brian wiggeff, 0 iff alsen, Mark nderson, Bob e 「 , Lon hristian, B 「記 ■ 0 前績 名成 4 - Ⅱ - CO 1 ー - Ⅱ - Ln ; 新 nd . : 立 0 廿 入新去 挿更消 ト : and . : 5 に 0 社ンい しデソ Figure26-2 生徒のリストを表示している EX26B の画面 空のフレーム内か、行ビューの生徒のレコード上でダブルクリックすると、図に示したように編 集ダイアログがポップアップする。ドキュメントファイル I/O と印刷も実装されている。 注意デバッグウインドウが表示されている場合には、 EX26B を終了した後、削除され ていない GDI オプジェクトに関するなんらかのメッセージに注意する。これらのメッセー ジは Windows のデバッグカーネルの DLL に関連するバグが原因である。これらは無視 する。 0 リソースへのアクセス EX26A DLL と EX26B はそれぞれ、アプリケーションフレームワークがどのようにリソースを 探すかを示す診断コードを収めている。文字列リソース / DS. ー T00 ー M. ス 0 ル 5 ( 値 3 を持っ ) は DLL のリソーススクリプトとクライアントのリソーススクリプトの両方で定義されている。し かし文字列の値はここで示すように少し異なっている。 リソーススクリプト IDS_TOO_MANY_ROWS の値 EX26A: スクローリングピューの容量がいつばいです EX26A. RC EX26B: スクローリングピューの容量がいつばいです EX26B. RC この違いによりどのリソースがアクセスされたかを知ることができる。 CRo 肥防麒 ) のコンストラクタ (YVCPPYEX26AYROWVIEW ℃ PP 中に置かれる ) は以下のコー 567

7. Inside Visual C++

PART 4 上級的なトピックス ドを収めている。 CString strRes ; strRes. LoadString(IDS—TOO-MANY_ROWS) ; TRACE("resource string = 0/os\n" , (const char*) strRes) ; #ifdef _AFXDLL HINSTANCE hInstResourceCIient = AfxGetResourceHand1e ( ) ; AfxSetResourceHandIe (extensionDLL. hModu1e) ; / / ューザー DLL のインスタンスハンドルを使用 strRes . LoadString ( 工 DS—TOO-MANY—ROWS) ; TRACE("resource string = %s\n" , (const char*) strRes) ; AfxSetResourceHandIe (hInstResourceC1ient) ; / / クライアントのインスタンスハンドルに復旧 #endif 最初のん 0 〃 S 加 g 呼び出しは、クラスライプラリのリソース検索機能の実験である。 ントファイル EX26B. CPP 内のル / e 関数が以下のコードを収めているので、 #ifdef _AFXDLL InitEx26aDLL() ; / / DLL リソースのアクセスや IsKindOf で必要 #endif クライア 最初のん s g の呼び出しはクライアントのリソースを使用する。ル″ E. 認 6 〃 D んんの呼び出し 568 リソースを使用する。 このん 04 & g の呼び出しはル″ F 認 6 〃 D. んんの呼び出しの有無に関らす、常にクライアントの TRACE( "resource string = 0/osYn" , (const char*) strRes) ; strRes . LoadString(IDS—TOO—MANY_ROWS) ; CString strRes; コードを収めている。 CE 26 ろ防 e 肥のコンストラクタ (YVCPPYEX26BYEX26BVW ℃ pp 中に置かれる ) は以下の 上記の 2 番目のカ 04 s レ切 g の呼び出しは DLL のリソースを使用する。 を取り除くと、ん 0 〃イ s 切 g は失敗し、ヌル文字列を返す。

8. Inside Visual C++

PART 2 クラスライプラリピュークラス 関数本体のコードを以下の太字のコード ( 読者が入力する ) で置き換える。 pDC—>TextOut ( 0 , 0 , ” He110 , 0 て Id ! " ) ・ pDC—>SeIectStockObject (GRAY—BRUSH) ; pDC—>EIIipse(CRect(O, 20 , 100 , 120 ) ) ; / / デフォルトのフォント、 / / サイズで左上隅に印刷する / / 円の内部用のプラシを選択 / / 直径 100 単位の灰色の円を描画 まだドキュメントを扱っていないので、 G 召の 0 襯 e 厩の呼び出しは安全に削除できる。関数 尨ェの、 & ん S ね 0 e 、 E 〃ゆはすべて、アプリケーションフレームワークの C. の C デバ イスコンテキストクラスのメンバ関数である。 Ellipse 関数は、バウンディング矩形の高さと幅 が同じなら円を描画する。 クラスライプラリは Windows での矩形指示用に便利な CRect と呼ばれるユーティリティクラ スを提供している。 CRect オプジェクトを一時的に作成して、楕円描画関数のバウンディング 矩形用の引数として使用できる。以降、本書内で多くの CRect の用途を見ることになる。 2. 再コンバイルし、 EX03A をテストする。 [ プロジェクト ] メニューから [ ビルド ] を選択し、コ ンパイルエラーがなければ、アプリケーションをもう一度テストする。今度は視覚的に何かをす るプログラムになる。 決定される。ファイル EX03A. RC は以下の Windows リソースを収めている ( あるいはそれを指す リソースファイルによって EX03A アプリケーションの「ルックアンドフィール」の多くの部分が AEX03A. RC の内容 ある。 れをテキストエデイタで変更するというのはよい考えではない。この処理は AppStudio の仕事で い機会である。アプリケーションのリソーススクリプト、 EX03A. RC は ASCII ファイルだが、 今や完全なアプリケーションがあるので、 App Studio リソースエデイタをざっと眺めるにはい App Studi0 を眺める一一リソースの導入 ものを収めている ) 。 リソース アイコン ツーノレノヾービ メニュー アクセラレータ ダイアログ ットマップ 58 文字列テープル 解説 アプリケーションの < バージョン情報 > ダイアログボックス中に表示される AFX ロゴ C 十十のソースコードには含まれない文字列 グボックス ダイアログボックスのレイアウトと内容—EX03A 用の < バージョン情報 > ダイアロ メニューとツールバーの選択をシミュレートするキーを定義 アプリケーションのメインメニューと関連するポップアップメニ メニューの直下のボタンの列 コ .

9. Inside Visual C++

隨■ : 国 0 口を旧口新ゴ可 0 府■ー PART 2 クラスライプラリピュークラス AppVtzard により、以下のような仕り新しいアアリクうのスグルけが生成されます。 ス名と生成されるフ加切関連 : ア丁リアラョン : CEx11aApp. EXIIA. H : EXIIA ℃叩 兀 - ム : CMainFrame, MAINFRM. H : MAINFRM.CPP 社 ) セル ド、キュメ ) ト : CEx11aDoc. EXI IADOC. H : EXI IADOC. CPP ビュ - : CExl laVlew, EXIIA\/W. H : EXIIAVW.CPP ヘルア旧 ) 特徴 : + ラ ) のルド、キュメ ) ト 1 ) 刃 1- ス (SDI) のサ - ト + MSVC 互換のアの、、 1 外万イルを生成 (EXI IA. MAK) + メイ ) ル - ム内にリ - ルハ、、 - とステ - タスハ、、 - をイ寸加 + 状況依存の勾げのサ - トと RTF カイ丿しのルト ) を生成 ー・・・・■■・・・・ : 新し生成る、。宀屮。シ、ンの情報 0 ストルディ盟トリ : C: EXIIA 2. AppStudi0 を起動し、ボタンのビットマップをインポートする。 AppStudi0 の [ リソース ] メ ニューから [ インポート ] を選択し、以下のビットマップファイルをインポートし、名前を付け る。各リソースは 2 回インポートすることになる。 1 回はボタンのアップ (U) 状態、そしてもう 1 回はボタンのダウン (D) 状態のためである。 1 番目のリソース ファイル ” COPYU ” YHLPYEDITCOPY. BMP ” CUTU ” YHLPYEDITCUT. BMP ” PASTEU ” YHLPYEDITPAST. BMP リソースが定数でなく文字列であることを保証するために、 <Bitmap プロバティ > ダイアログ の ID フィールド中で引用符を使うこと。これにより ID は RESOURCE. H ファイル中には現わ れない。 3. 「ダウン」ビットマップの色を反転する。 COPYD ビットマップを選択し、 App Studi0 の [ イメー ジ ] メニューから [ 色の反転 ] を選択する。 CUTD と PASTED にもこれを繰り返す。実行時に ビットマップボタンがアップ状態からダウン状態に変わったとき、 U ( 非反転 ) ビットマップは D ( 反転 ) ビットマップに置き換えられ、ボタンの色が変えられる。次の画面は、 AppStudio 内 の COPYD ビットマップを示している。 2 番目のリソース ” COPYD ” ” CUTD ” ” PASTED ” ・方イル旧編集旧リソ - ス ( R ) 1 メ - ラ、、 ( M ) ウイ ) ド、ワ ( 勾げ ( 旦 ) 202

10. Inside Visual C++

PART 4 上級的なトピックス ライアントアプリケーションが終了したとき、 DLL 関数中で割り当てられたメモリも含め、割り当 てられたすべてのメモリは解放される。 こうなるともはや DLL は独立したプログラムというより は、クライアントアプリケーションの一部に見えてきただろう。従来の DLL では、 DLL とクライ アントアプリケーションはスタックを共有し、グローバル変数を所有していただけである。 注意静的にリンクされたクラスライプラリアプリケーションでは、カレントアプリケー ションオプジェクト、カレントインスタンスハンドル、カレントリソースハンドルといった アプリケーションごとに識別される要素は、クラスライプラリ内で定義されているグロー バル変数として参照される。クラスライプラリ DLL は、これらのグローバル変数を、ク ライアントアプリケーションのスタックセグメント中の固定された位置に移動する。 0 拡張 DLL に必要なコード 読者が書くクラスライプラリの拡張 DLL には、それぞれ以下のような定型コードを収めなけれ ばならない。 DLL 内のんあ M 〃加関数はル切 4 に相当するもので、 DLL がロードされたときに Windows がこれを呼び出す。 こでル D. んんという名前を付けた DLL の初期化関数は、必要 に応してクライアントアプリケーションから呼び出される。この理由は後で示される。 #include く afxdllx . h> / / 先に #include <afxwin. h> されていると仮定 extern AFX—EXTENSION_MODULE NEAR extensionDLL = {NULL , NULL} ; extern "C" int CALLBACK LibMain(HINSTANCE hlnstance , WORD , WORD , LPSTR) / / こ こではメモリ確保、ならびに TRACE 、 ASSERT 、 MessageBox の使用を控える / / 以下の DLL 初期化関数はクライアントアプリケーションから呼び出される return 1 ; / / 正しい Afx 工 nitExtensionM0duIe (extensionDLL, hlnstance) ; new CDynLinkLibrary (extensionDLL) ; extern extern void WINAPI InitMyDLL() CString strError ; を含むプログラムを考える。 0 リソースの検索 DLL 、クライアントアプリケーションとも、独自のリソースを持っことができる。以下のコード strError. LoadString(IDS—ERROR1) ; 556 か ? クラスライプラリのクライアントアプリケーション内のリソースなのか、 DLL のものなのか ? アプリケーションフレームワークは、 / DS ー E. 0 7 で識別される文字列をどこから検索するの