QTで遅延DLLロードが可能ですか? たとえば、私のプログラムはサードパーティのDLLからの依存関係があり、削除したいと思っています。QTの遅延DLLロード
依存関係を削除するには、.proファイルに何を書き込むべきですか?
DLLをリソースに格納できますか?
"グローバルに" DLLをロードできますか?したがって、DLLからのいくつかの関数(たとえばfunc1)は、私のコードでfunc1のままになります。
QTで遅延DLLロードが可能ですか? たとえば、私のプログラムはサードパーティのDLLからの依存関係があり、削除したいと思っています。QTの遅延DLLロード
依存関係を削除するには、.proファイルに何を書き込むべきですか?
DLLをリソースに格納できますか?
"グローバルに" DLLをロードできますか?したがって、DLLからのいくつかの関数(たとえばfunc1)は、私のコードでfunc1のままになります。
はい、QLibrary
クラスを使用します。実行時に共有ライブラリをロードするために提供されています。
この場合、.proファイルには何も必要ありません。ただし、ターゲットコンピュータでDLLが使用可能であることを確認する必要があります。システムが見つけられる場所(WindowsではPATH、LinuxではLD_LIBRARY_PATH、MacではDYLD_LIBRARY_PATH)にするか、アプリケーションから絶対パスを指定する必要があります。
ドキュメントを見ると、 "func1()"がライブラリ内の関数を指すように、ライブラリ関数をコード内の関数ポインタにマップする方法がわかります。
ここで[編集]
は、プルーフ・オブ・コンセプト資源から生成された一時ファイルからDLLをロードすることです。 IMO、これは本当に悪い考えですが、少なくとも私のWindows 7マシンで動作します。あなたが似た何かをしたい場合は、重複をチェックし、一時ファイルをクリーンアップ処理する必要があります、など共有ライブラリ
#include <QtCore/qglobal.h>
extern "C" Q_DECL_EXPORT int foo(int value) {
return value + 42;
}
バーにコンパイル
foo.cpp、。プロ、ライブラリーのfooへの参照を気付かない
SOURCES += main.cpp
RESOURCES += resources.qrc
main.cppに
#include <QtCore>
#include <iostream>
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
// Copy resource dll to temporary file.
QFile::copy(":/lib/Foo.dll", QDir::temp().filePath("Foo.dll"));
// Load the temporary file as a shared library.
QLibrary foo_lib(QDir::temp().filePath("Foo.dll"));
typedef int (*FooDelegate)(int);
FooDelegate foo = (FooDelegate)foo_lib.resolve("foo");
if (foo) {
std::cout << "foo(13) = " << foo(13) << std::endl;
}
}
私はMicrosoftコンパイラの観点からしか話すことができません... QTが望むものは、遅延ロードされたコードやデータにいつアクセスするのかによります。
一般に、DLLに/delayload:[dllname]
オプションを使用して遅延がロードされており、delayimp.libとリンクしていることをリンカに伝える必要があります。あなたは、リンカコマンドラインでそれを指定する必要がなくなります
#pragma comment(lib, "delayimp")
と.cppファイルにライブラリを追加することができます。
リンカーコマンドにdelayloadスイッチを追加するために、.proファイルに何が入っているのかわかりません。
Microsoftドキュメントについては、this linkを参照してください。
あなたの答えをありがとう。しかし、私は '/ delayload:[dllname]'をQTで書く場所を知らない... QTは "プラグマコメントを無視する"も返す。 – Eddie
+1。答えをありがとう。しかし、私の問題は、ターゲットコンピュータでDLLが利用できないということです。だから、依存関係を取り除き、リソースに格納し、可能であれば動的にロードします。また、ユーザーはインストールせずに1つの.exeファイルのみを表示する必要があります... – Eddie
ああ、わかります。あなたは既にこれを考えているでしょうが、静的にリンクできるライブラリのバージョンを入手できますか?それは、最終的に、あなたが達成しようとしているもののように聞こえます。 –
静的にリンクできない場合は、main()メソッドで* DLLをバイナリリソースとしてロードし、システムの一時ディレクトリのような特定の場所に配置し、 'QLibrary'それをそこからロードする。それは本当に悪いコードのにおいですが、セキュリティの問題があるかもしれません。 –