代码:
#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(真); (首先要求一个功能)
它fr and并给我以下
test_trans_new.exe中0x00000000处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。
我猜这是因为函数指针指向NULL但我不知道如何解决它
我使用visual c ++ 2010
提前致谢
谢谢你所有的答案,这些答案真的很有帮助,但问题仍然存在,但我大致知道如果我纠正问题的原因是我尝试访问的函数是COM类型所以任何关于使用此类型的想法
提前谢谢
答案 0 :(得分:3)
FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel");
这是一个保证NULL。调用它确实是kaboom,你没有检查功能是否成功。导出的函数未命名为“EnableLastCharTashkeel”。更可能的字符串是“?EnableLastCharTashkeel @@ YAX_N @ Z”。这是C ++编译器破坏它之后的函数名称,这是支持重载函数的技巧。
您可以声明函数extern“C”,它禁止名称修改并使函数名称为“_EnableLastCharTashkeel”。请注意32位编译器用来标记该函数使用__cdecl调用约定的前导下划线。可以肯定的是,从Visual Studio命令提示符运行DLL上的Dumpbin.exe / exports,它会显示导出的名称。
答案 1 :(得分:1)
这很可能是0,因为找不到你试图在DLL中找到的符号,这表明(a)它不存在或者(b)函数名中可能存在拼写错误或(c) )函数名称可能会被修改,因为它被导出为装饰名称。这在C ++中发生了很多......
除非导出这四个功能的库在您的控制之下,否则请使用dumpbin /EXPORTS
并查看符号的正确拼写。