我正在尝试将一个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:nd部分得到dllNotFoundException。我该如何解决这个问题?我错过了任何依赖或任何东西。我的dll是使用msvc2010编译器构建的.pro文件如下所示:
cDLL.pro
TEMPLATE = lib
CONFIG += dll
QT += core
# Input
SOURCES += main.cpp
我被困了......
答案 0 :(得分:2)
它没有准确地告诉您它无法找到的 DLL。这几乎肯定不是你的 DLL,它是QT所需的DLL之一。您还必须将它们复制到EXE文件夹中。如果您不知道并且无法在诺基亚文档中找到它,那么您可以使用SysInternals的ProcMon实用程序找到它。
但是,在这种情况下,您肯定希望将QT链接到您的DLL,因为这些DLL可以共享的几率很小。使用此SO question作为设置QT项目的指导。
答案 1 :(得分:0)
您需要将DLL放在与可执行文件相同的文件夹中。
请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx