代码:
#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 successfully\n";
else
cout<<"loading error\n";
/* 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(true); (第一次调用函数)
它卡住并给我以下内容
test_trans_new.exe 中 0x00000000 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。
我猜这是因为函数指针指向 NULL 但我不知道如何修复它
我使用 Visual C++ 2010
提前致谢
感谢您的所有回复,这些回复确实很有帮助,但问题仍然存在,但我大致知道如果我更正问题的原因是我尝试访问的函数是 COM 类型的,所以关于使用此类型的任何想法
提前致谢
最佳答案
FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel");
那肯定是 NULL。调用它确实是一团糟,你没有检查函数是否成功。导出的函数未命名为“EnableLastCharTashkeel”。更有可能的字符串是“?EnableLastCharTashkeel@@YAX_N@Z”。这是 C++ 编译器对它进行处理后的函数名称,支持重载函数的技巧。
您可以将函数声明为 extern“C”,它会抑制名称重整并使函数名称成为“_EnableLastCharTashkeel”。请注意前导下划线,32 位编译器使用它来标记该函数使用 __cdecl 调用约定。可以肯定的是,从 Visual Studio 命令提示符在您的 DLL 上运行 Dumpbin.exe/exports,它会显示导出的名称。
关于c++ - 调用DLL函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5943775/