2017-10-26 21 views
2

明示的にライブラリをロードするためのきれいな方法を探しています。ほとんどの場合、私はLIBとDLLのペアを持っているので、LIBはすべての "load stuff"を扱い、私はdllの関数を直接呼び出すことができます。明示的にこれを行うとき、私は次のようなものを実行する必要がありますLoadLibrary関数(場合明確な方法でライブラリを明示的にロードする

HMODULE libA = LoadLibrary("dllA.dll"); // NULL if load failed 
HMODULE libB = LoadLibrary("dllB.dll"); // NULL if load failed 

void (*functionA)(void) = libA ? GetProcAddress(libA,"functionA"):NULL; 
void (*functionB)(void) = libB ? GetProcAddress(libB,"functionB"):NULL; 

それは乱雑になります)、私はDLL内の関数を呼び出すために必要がある場合のGetProcAddress()はすべての私のコードの上に発見されました。私は1-2ファイル内のすべての処理を記述し、LIBとDLLのペアを介して暗黙的にライブラリをロードしているかのように関数を呼び出すことができるようなきれいな方法があるかどうかを知りたいと思います。

+2

すべての関数ポインタを取得して使用するために、一度に1つの場所で 'LoadLibrary'と' GetProcAddress'を呼び出すことができます。このDLLの遅延ロードを実装することもできます – RbMm

+2

これはプログラミング101です。この機能を包括する関数またはクラスを作成し、詳細から保護します。 –

+0

また、[Boost.DLL](http://www.boost.org/doc/libs/release/doc/html/boost_dll.html)を見て、いくつか抽象化しているかもしれません。まだ使用していませんが、[examples](http://www.boost.org/doc/libs/release/doc/html/boost_dll/tutorial.html#boost_dll.tutorial.plugin_basics)はきれいに見えます。 – zett42

答えて

2

実際には、暗黙的なリンクの利便性を得る方法はありますが、ライブラリの読み込みとシンボル検索の両方の失敗を正常に処理することはできます。 Visual StudioにはLinker Support for Delay-Loaded DLLsが用意されています。ユーザーコードにローダーをフックする機能があり、使用できないシンボルの任意の回復戦略を実装できます(ノーオペレーションスタブを返すなど)。これにより、すべての障害処理を単一の場所に統合することが可能になります。

+0

私は現在遅延ロードも使用しています。私の目標は、よりプラットフォームに依存しないオプションを持つことです。私はロードライブラリとGetProcAddressもプラットフォームに依存していることを知っていますので、モジュールを将来容易に変更できるように、これらすべての "読み込み用のもの"を扱う別個のモジュールが必要です。 –

+2

@RonaldKu:モジュールの読み込みは、基本的にプラットフォームに依存します。ただし、プラットフォームに依存しないインターフェースを提供することができます。利用できないシンボルに対して 'nullptr'を返すことによって、または 'std :: optional'を使用し、[value_or](http://en.cppreference.com/w/cpp/utility/optional/value_or)とノーオペレーションスタブポインタを使用します。時間が許す限り、コンセプトを説明するためのサンプルコードを考案できるかどうかがわかります。 – IInspectable

0

必要な外部機能への純粋なインターフェイスを作成します。 (プラットフォームに依存)

(あなたのプラットフォーム用)実装クラスを提供します。あなたのWindowsの実装では、DLLをロードし、最初にプロシージャのアドレスを取得します。

インターフェイス関数を呼び出す必要がある場合、クラスは呼び出しをロードされたDLLにルーティングします。

他のプラットフォームでも同様の方法を使用します。

これは、遅延読み込みDLLの使用以外には何もありません。それは単なるマニュアルソリューションです。しかし、インターフェースを使用するアプローチは、実際のプラットフォームに依存するソリューションを可能にします。

関連する問題