2012-04-12 22 views
3

QTで遅延DLLロードが可能ですか? たとえば、私のプログラムはサードパーティのDLLからの依存関係があり、削除したいと思っています。QTの遅延DLLロード

依存関係を削除するには、.proファイルに何を書き込むべきですか?

DLLをリソースに格納できますか?

"グローバルに" DLLをロードできますか?したがって、DLLからのいくつかの関数(たとえばfunc1)は、私のコードでfunc1のままになります。

答えて

5

はい、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; 
    } 
} 
+0

+1。答えをありがとう。しかし、私の問題は、ターゲットコンピュータでDLLが利用できないということです。だから、依存関係を取り除き、リソースに格納し、可能であれば動的にロードします。また、ユーザーはインストールせずに1つの.exeファイルのみを表示する必要があります... – Eddie

+0

ああ、わかります。あなたは既にこれを考えているでしょうが、静的にリンクできるライブラリのバージョンを入手できますか?それは、最終的に、あなたが達成しようとしているもののように聞こえます。 –

+1

静的にリンクできない場合は、main()メソッドで* DLLをバイナリリソースとしてロードし、システムの一時ディレクトリのような特定の場所に配置し、 'QLibrary'それをそこからロードする。それは本当に悪いコードのにおいですが、セキュリティの問題があるかもしれません。 –

3

私はMicrosoftコンパイラの観点からしか話すことができません... QTが望むものは、遅延ロードされたコードやデータにいつアクセスするのかによります。

一般に、DLLに/delayload:[dllname]オプションを使用して遅延がロードされており、delayimp.libとリンクしていることをリンカに伝える必要があります。あなたは、リンカコマンドラインでそれを指定する必要がなくなります

#pragma comment(lib, "delayimp")

と.cppファイルにライブラリを追加することができます。

リンカーコマンドにdelayloadスイッチを追加するために、.proファイルに何が入っているのかわかりません。

Microsoftドキュメントについては、this linkを参照してください。

+0

あなたの答えをありがとう。しかし、私は '/ delayload:[dllname]'をQTで書く場所を知らない... QTは "プラグマコメントを無視する"も返す。 – Eddie