VC++資源の静的ライブラリ
-
22-08-2019 - |
質問
可能での構築資源への静的ライブラリを再利用しているだけで結ぶのですか?
私は主として考える場合に呼び出す機能を図書館にアクセスします。
解決
に行うことができ、smartoption™は、世界トップクラス:できないのであるだけでリンクの静的ライブラリ。
このことを考え:資源の埋め込EXEはDLL.時に一部のコードの静的ライブラリ呼び出し(例えば)LoadIconでの資源からのエグゼDLLまたはこのリンクです。
その場合には静的ライブラリが必要で資源の利用可能なんかカップルのオプション:
- すでに図書館を構築し、その利用(例)
CreateDialogIndirect
.見陳のレイモンド を築きあげる"というダイアログテンプレート実行時に". - できて組み込みの図書館として簡単な配列(例)
char my_dialog_resource[] = { .... };
, その利用(例)CreateDialogIndirect
.かば(または書き)を光に変換するから.RES
ファイル.CPP
ファイルです。 - できる船は、LIBファイルリソースリクエストを要求したページ
.RC
ファイル)に対応するヘッダファイルです。まし#include
として関係します。ご予約する必要がある範囲の資源Idのリチウムイオン電池は使用でないことにぶつかのメインエグゼはDLL.そのMFCせとして使用する場合の静的ライブラリ。または利用できるstringリソースId(こができないSTRINGTABLE
資源). - ご静的ライブラリで船は別のリソースDLL.
他のヒント
唯一のものだけを利用資源(画像、ダイアログなど)には静的ライブラリVisual C++2008年) の静的ライブラリの関連付けます。resファイル にご注意願います。この表現が可能となり"プロジェクトの設定/リンカー/入追加の依存関係".
本ソリューションでは、資源の静的ライブラリを詰めます。exeので、必要な追加DLL.残念ながら、Visual Studioを含まない。resファイルを自動的にしています。libファイルをご使用の場合"プロジェクト依存関係"-だと思いこの小さなペットボトルが可能です。
していた非常に長い時間このソリューションでは驚いるのは簡単です。唯一の問題は完全に非正規滞在.
かなければならなかった、MS Visual Studioのコンパイラです。また変換の一部の遺産プロジェクトが大幅に向に静ます。数が大幅に向上したダイアログまたは文字列の資源組み込みます。このコンパイル。RCスクリプトこれらのDllに当社の主な用途を含めてメインのアプリケーションのRCスクリプトファイルの"TEXTINCLUDE"。いつでも簡単にこれを編集してRCファイルを直接、視覚リハビリ特化型デイサービスわずかに"wizardy"機構です。の実装が異なるその他のコンパイラでコンパイル.
操作のRCスクリプトを直接:
.1.の2TEXTINCLUDE"部門のヘッダファイルを定義するリソースIdお図書館があります。構文は
2 TEXTINCLUDE
BEGIN
"#include ""my_first_lib_header.h""\r\n"
"#include ""my_second_lib_header.h""\0"
END
.2.の3TEXTINCLUDE"部門のRCスクリプトからの図書館があります。
3 TEXTINCLUDE
BEGIN
"#include ""my_first_library.rc""\r\n"
"#include ""my_second_library.rc""\0"
END
手順3および4に実現されなければならな自動的にかけるという次の欲が出ることもあり信頼性の高いだけに、利用者はこれらの情報を入力すが、自分のよMicrosoftの資源のスクリプトのコンパイラに入っています。
.3.追加のヘッダファイルをご図書館資源の定義を読み取りのみ記号一覧です。このリストは、通常の近くにファイルです。
#define APSTUDIO_READONLY_SYMBOLS
#include "my_first_lib_header.h"
#include "my_second_lib_header.h"
#undef APSTUDIO_READONLY_SYMBOLS
.4.ご図書館のRCスクリプトのAPSTUDIO_INVOKEDます。通常は、下のファイルです。
#ifndef APSTUDIO_INVOKED
#include "my_first_library.rc"
#include "my_second_library.rc"
#endif
することができます自動的により、visual studio.net開発環境との統合が可能のものでない場合ます。
- の"リソースビュー"ウィンドウ用できます。
- 右クリックメイン用のリソースファイルを選択"の"リソースを含む..."は、コンテキストからメニューです。
- の"ok"ボタンを押し"読み取りシンボルディレクティブを追加"を含む諸表ます。hファイルを定義するリソースIDのご図書館です。
- のボックス"のコンパイル時のディレクティブを追加"を含む諸表のための図書館です。rcスクリプト
- をクリックしませていただきます。また手動でトリガーのRCスクリプト作成をしてください。
ご図書館資源のスクリプトの参照ファイルはディスク(テキストファイルのアイコンのファイル等)、 まれるようにする必要がありメインのアプリケーションプロジェクトを知って場所を探します。きのいずれかのコピーこれらのファイルをどこかでお申し込み可能しまたは追加できるなどのコンパイラを設定します。
追加の追加などのパス:
- のプロパティ]ダイアログ用の代表的な用途となります。
- 選択コンフィグレーションプロパティ/Resources/一般"から左側のナビゲーション表示されなくなります。
- 物件のリストで入力適切な経路次に、"追加などのディレクトリが入っています。"
私はそうは思いません。静的ライブラリは、それ自身のHINSTANCEを持っていません。これは、コードがそれをリンクDLLまたはEXEのコンテキストで実行されます。あなたは、静的ライブラリのコードからロードしようとするでしょう、すべてのリソースは、その外側のDLL / EXEのものであろう理由です。
私は、リソースの種類は、限り、それはそれ自身のアドレス空間を持っており、あなたはDLLのHINSTANCEとLoadResourceを呼び出すことができるように、しかしDLLを再利用しました。
とVisual Studio2010の開発ツール株式会社エンパシは、Microsoft社からwindowsそうでない適切に取り扱い作成リソースデータ内の静的ライブラリです。
配信デリソースファイル( .res
ファイル)は、二つの選択肢:
- に分配する
.res
ファイルを別の指導のクライアントコードをリンクしている。; - 使用
cvtres
合併数.res
ファイルを単一のオブジェクト(.obj
)ファイルを提供します。
ることはできないので注意しlibオブジェクトで作成されたファイル cvtres
.複数のオブジェクトファイルを提供してい lib
文句が複数の .res
ファイルが指定されたとき場合は単一のオブジェクトファイルは、 lib
ないものリンカーは単に無視し、組み込みリソースデータはlibファイルです。
この方法はありますので、リンカー読みやリンクのlibbed資源データ(一部コマンドラインオプションセン操作など)、資源のデータは実際の図書館(として dumpbin
明).今のところ、な解決法を見いだしたのは、いずれかの場合を除いて、あるものだけを開発ツール、何でも良いこれ以上のグループに参加"ボタンをしていくにはおそらく価値は十分あります。
の船舶資源データに静的ライブラリ(この場合、 と 静的ライブラリ)の配布資源を個別に明示的にリンクし、クライアントコード.を使用 cvtres
数を削減することが可能とな分散型リソースファイルはすべてください。
お勧めの方法は、あなたのライブラリーと一緒にリソースをDLLを提供することです。
場合、以下のメソッドが使用されるので、任意のリソース(この例では、アイコン)を使用できるとって不可欠な構成要素と見なしの静的ライブラリなどの図書館での利用にもアプリケーションタイプのを含むコンソールの一つを持たない資源セグメントには一切).
- アイコンに変換される静的な配列のバイトになります。 bin2c 使用できます。
データに変換されHICONます。このとき:
HICON GetIcon() { DWORD dwTmp; int offset; HANDLE hFile; HICON hIcon = NULL; offset = LookupIconIdFromDirectoryEx(s_byIconData, TRUE, 0, 0, LR_DEFAULTCOLOR); if (offset != 0) { hIcon = CreateIconFromResourceEx(s_byIconData + offset, 0, TRUE, 0x00030000, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE); } return hIcon; }
GetIconくLoadIcon.の代わりに呼び出し:
m_hIcon = ::LoadIcon(hInstanceIcon, MAKEINTRESOURCE(pXMB->nIcon));
呼び出して、
m_hIcon = GetIcon()