Qtプラグインが静的または動的に初期化されているかどうかを判断する方法はありますか? 動的に初期化されている場合、プラグインがその動的ライブラリ (.dll または .so) へのパスを決定する方法はありますか?
1 に答える
QPluginLoaderには、次の 2 つの関数があります。
a)QObjectList QPluginLoader::staticInstances ()
プラグイン ローダーが保持する静的プラグイン インスタンス (ルート コンポーネント) のリストを返します。
b)QString fileName () const
このプロパティは、プラグインのファイル名を保持します。ロード可能にするには、ファイルのサフィックスが、プラットフォームに応じてロード可能なライブラリの有効なサフィックスである必要があります。たとえば、Unix では .so、Mac OS X では .dylib、Windows では .dll です。サフィックスは QLibrary::isLibrary() で確認できます。
残念ながら、特定のプラグイン用のプラグイン ローダーがない場合、できることはあまりありません。プラグインは特別なインターフェースを必要とせず、 から直接派生させることができますQObject
。でプラグインをエクスポートすると、プレフィックス付きのプラグイン インスタンスへのポインターQ_EXPORT_PLUGIN2
のみが宣言されます。QObject
qt_plugin_instance
プラグインをロードしても特定の関数は呼び出されないため、プラグイン自体に提供する方法がわかりません。
ただし、移植性を失うことを厭わない場合は、何かを行うことができます。Windows では、プラグインは単なる dll であり、標準の Windows システム コールを介して Qt によって内部的にアクセスされます(たとえば、LoadLibrary
関数を使用してロードされ、プロシージャへのポインターはGetProcAddress
、呼び出しで解放されます)、このアプローチFreeLibrary
を試すことができます(私はそれをテストしていません。これは醜いハックですが、うまくいくかもしれません)。
// near the top of your CPP file
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
// and then, anywhere you need it:
LPTSTR strDLLPath1 = new TCHAR[_MAX_PATH];
::GetModuleFileName((HINSTANCE)&__ImageBase, strDLLPath1, _MAX_PATH);
VS2002 (およびそれ以降) リンカーでコンパイルされた EXE または DLL は、モジュールの DOS ヘッダーを表す __ImageBase という疑似変数を提供するようです (すべての 32 ビット バイナリにこれがあります)。この変数を HINSTANCE にキャストするだけで、最初のパラメーターとして GetModuleFileName() に渡すことができます。
Unix システムでは、プラグインは標準の dlopen() システム コールを介してロードされるため、ここからソリューションを使用できます。