使用 c++ DLL 中的函数
Use a function from c++ DLL
我正在使用QT,使用DLL是QLibrary。但是我似乎无法在其中加载函数并在我的项目中使用它。
void Compose3wnThread::GenPrinterFile()
{
lib_3wn = new QLibrary;
lib_3wn->setFileName(qApp->applicationDirPath() + "/" + MyDLL);
lib_3wn->load();
if (lib->isLoaded())
{
typedef int (*initial)(char*, int, char*);
initial function = (initial)lib_3wn->resolve("API_Initial");
int result;
result = 0;
//result = (int)function("Nobel Superfine", 12, "D:\final.3wn");
}
}
lib_3wn是保存我的 DLL 的 QLibrary 对象。运行上面的代码后,该函数保持0x0或没有任何值。这是我需要从 DLL 加载的函数。
int API_Initial(char *machineType, int totalLayers, char *fileName)
此函数来自定义我正在使用的 DLL 中的函数的文档。我没有自己创建 DLL。
我该如何解决这个问题?
来自QLibrary
文档:
符号必须从库中导出为 C 函数。这意味着,如果使用C++编译器编译库,则必须将函数包装在
extern "C"
中。在 Windows 上,还必须使用__declspec(dllexport)
编译器指令从 DLL 显式导出函数
您应该在API_Initial
的声明和定义中添加extern "C"
:
extern "C" int API_Initial(char *machineType, int totalLayers, char *fileName)
或将其包含在extern "C"
块中:
extern "C" {
int API_Initial(char *machineType, int totalLayers, char *fileName);
}
C++具有函数重载,但 中的每个函数都需要一个唯一的名称供链接器使用。 为了实现这一点,名称被修改以对其签名进行编码。 这意味着int foo(int)
和int foo(double)
具有不同的名称,链接器可以区分它们,但两者都没有命名为foo
。 一个名为?foo@@YAHH@Z
,另一个名为?foo@@YAHN@Z
(在Windows上。 其他平台有不同的名称重整方案,但想法是相同的)。
这意味着当QLibrary
查找名称API_Initial
时,它找不到它。 它可以?API_Initial@@YAHPEADH0@Z
找到这个名字,但没有很好的独立于平台的方式来派生这个名字。
向函数声明添加extern "C"
将禁用此名称重整,但会排除函数重载,将名称限制为全局命名空间,并将函数的接口限制为仅可复制的对象类型和指针。
尝试
initial function = (initial)lib_3wn->resolve("_API_Initial");
或
initial function = (initial)lib_3wn->resolve("_API_Initial@4");
或
initial function = (initial)lib_3wn->resolve("@API_Initial@4");
取决于调用约定。有关更多信息,请参阅此处
谢谢你的所有答案。我有点使用@Antonio迪亚斯的评论修复了它。我使用了Dependency Walker,然后我看到我提到的DLL依赖于(不是有意的)另外两个[2]DLL文件。
前面的代码已经正确。
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- C++ DLL 引用C++.exe中的函数和类
- 如何使用导出的函数交叉编译 DLL
- 如何在窗口中使用注入的 dll 中的参数调用函数
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 加载由 MATLAB Coder 生成的带有函数的 DLL,该函数调用外部函数
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 从DLL导出函数,LoadLibrary()需要用TEXT转换的字符串才能编译而不会出错
- 从 C#-DLL 调用函数的 C++ 失败
- 如何在 DLL 内的成员函数中使用互斥/关键节
- 调用 "project" 函数和调用 DLL 函数之间的区别
- 函数指针分配在创建 DLL 后导致错误
- 从动态加载的 dll 内部调用C++函数
- 函数声明中的 WINAPI 标识符C++ DLL 入口点函数中的标识符
- LNK2019某些类函数,但不在其他类函数(DLL 中的模板类)上
- 从库导入函数./ DLL 文件
- 从 ntdll 调用 Nt 函数.dll在 Win32 环境中,C++
- 如何使用ctypes将python列表传递给C函数(dll)