2

dllをC#コンソールアプリケーションにインポートして、dllを希望どおりに機能させることができるかどうかを確認しようとしています。これを試し、Cコードで関数をエクスポートすると、すべてが正常に機能し、関数をC#アプリケーションにインポートできます。 。

管理されていないdllのいくつかのQTメソッドに何らかのリンクを追加しようとすると、問題が発生します。DllImportを使用してdllから関数をインポートしています。

[DllImport("cDLL.dll", EntryPoint = "_Add@16")]
static extern double Add(double a, double b);

1-これは、アンマネージdll(コードの機能を確認しないでください。これはテスト目的のみです)が正常に機能する場合の外観です。

main.cppが機能しています

#include <stdexcept>
#include "Windows.h"

using namespace std;

extern "C" __declspec(dllexport) double __stdcall Add(double a, double b)
{
    return a + b;
}
extern "C" __declspec(dllexport) const char* getText()
{
    return "hello world";//returnBufferString.c_str();
}
BOOL __stdcall DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) {
    return TRUE;
}

2-いくつかのQTコードでヘルプ関数を追加しようとすると、通常のQStringだけでDllImportがdllNotFoundException.dumpbin.exeをスローし始め、qtコードを含めた後にエクスポートされたすべての関数も表示されます...

main.cpp dllNotFoundException

#include <QString>
using namespace std;
class testa
{
public:
    static char* test()
    {
        QString a = "hejsan";
        return qString2Char(a);
    }
    static char* qString2Char(QString a)
    {
        return a.toUtf8().data();
    }
};

これは、次のようにgetText()関数から呼び出されます。

string returnBufferString;
extern "C" __declspec(dllexport) const char* getText()
{
    returnBufferString = testa::test();
    return returnBufferString.c_str();
}

DllImportからdllにアクセスしようとすると、2番目の部分でdllNotFoundExceptionが発生します。どうすればこれを解決できますか?依存関係などを見逃したことがありますか。私のdllはmsvc2010コンパイラを使用してビルドされており、.proファイルは次のようになります。

cDLL.pro

TEMPLATE = lib
 CONFIG  += dll

QT += core

 # Input
 SOURCES += main.cpp

私は立ち往生しています...

4

2 に答える 2

2

どのDLL が見つからないかは正確にはわかりません。これはほぼ確実にあなたのDLL ではなく、QT が必要とする DLL の 1 つです。それらもEXEフォルダーにコピーする必要があります。よくわからず、Nokia のドキュメントで見つからない場合は、SysInternals の ProcMon ユーティリティで調べることができます。

ただし、このシナリオでは、QT を DLL にリンクする必要があります。これらの DLL を共有できる可能性は低いからです。QT プロジェクトを設定する際のガイダンスとして、このSO の質問を使用してください。

于 2012-08-02T11:40:28.807 に答える
0

DLL を実行可能ファイルと同じフォルダーに配置する必要があります。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspxを参照してください。

于 2012-08-02T10:47:13.210 に答える