调用 DLL 函数问题
calling DLL functions problem
code:
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
void calldll();
int main(int argc, char *argv[])
{
calldll();
system("PAUSE");
return EXIT_SUCCESS;
}
void calldll()
{
HINSTANCE LoadMe;
LoadMe = LoadLibrary("Trans_ATL.dll");
if(LoadMe!=0)
cout<<"loaded successfullyn";
else
cout<<"loading errorn";
/* get pointer to the functions in the dll*/
FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel");
FARPROC function02 = GetProcAddress(LoadMe,"EnableEmphaticLAM_RAA");
FARPROC function03 = GetProcAddress(LoadMe,"SetText");
FARPROC function04 = GetProcAddress(LoadMe,"GetResult");
typedef void (__stdcall * pICFUNC01)(bool);
typedef void (__stdcall * pICFUNC02)(bool);
typedef bool (__stdcall * pICFUNC03)(string);
typedef string (__stdcall * pICFUNC04)(string);
pICFUNC01 EnableLastCharTashkeel_function;
EnableLastCharTashkeel_function = pICFUNC01(function01);
pICFUNC02 EnableEmphaticLAM_RAA_function;
EnableEmphaticLAM_RAA_function = pICFUNC02(function02);
pICFUNC03 SetText_function;
SetText_function = pICFUNC03(function03);
pICFUNC04 GetResult_function;
GetResult_function = pICFUNC04(function04);
EnableLastCharTashkeel_function(true);
EnableEmphaticLAM_RAA_function(true);
FreeLibrary(LoadMe);
}
在此代码中,我调用了一个DLL,它已成功加载,但是当我尝试使用任何函数时,它会编译而没有任何错误,但在行
EnableLastCharTashkeel_function(真);(第一次调用函数)
它冻结并给我以下内容
test_trans_new.exe:0xC0000005:访问冲突读取位置0x00000000 0x00000000未处理的异常。
我想这是因为函数指针指向 NULL,但我不知道如何解决它
我使用 Visual C++ 2010
提前致谢
感谢您的所有回复,这些回复真的很有帮助,但问题仍然存在,但我大约知道如果我纠正问题的原因是我尝试访问的功能是 COM 类型,所以关于使用此类型的
任何想法提前致谢
FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel");
这是一个保证的空值。 调用它确实会失败,您没有检查函数是否成功。 导出的函数未命名为"EnableLastCharTashkeel"。 更可能的字符串是"?EnableLastCharTashkeel@@YAX_N@Z"。 这是C++编译器破坏函数后的名称,这是支持重载函数的技巧。
您可以声明函数 extern "C",它抑制名称重整并使函数名称为"_EnableLastCharTashkeel"。 请注意前导下划线,32 位编译器使用它来标记函数使用 __cdecl 调用约定。 可以肯定的是,从Visual Studio命令提示符在DLL上运行Dumpbin.exe/exports,它会显示导出的名称。
很可能是 0,因为找不到您尝试在 DLL 中查找的符号,这表明 (a) 它要么不存在,要么 (b) 函数名称中可能有拼写错误,或者 (c) 函数名称可能被破坏,因为它被导出为修饰名称。这在C++中发生了很多...
除非导出这四个函数的函数库在您的控制之下,否则请使用dumpbin /EXPORTS
并查看符号的正确拼写。
- Visual Studio中的函数声明和函数定义问题
- C++quit()函数中可能存在作用域问题
- 类似于strcat()的函数出现问题
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 类C++中的函数问题(LNK2019和LNK1120错误)
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 关于简单C++函数(is_palindrome)的逻辑的问题
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- constexpr构造函数需要常量成员函数时出现问题
- 添加存储在向量中的大整数的函数出现问题
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 关于 c++ 函数中指针赋值的简单问题
- 如何在标头中声明(或定义)函数的问题
- 有关 c++ 构造函数的问题
- 模板类转换问题 - 无法推断调用的函数
- 从 C++ 中的函数返回数组地址问题
- 关于复制构造函数的一个棘手问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题