调用DLL函数问题

时间:2011-05-10 00:04:20

标签: c++ windows visual-c++ dll

代码:

    #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类型所以任何关于使用此类型的想法
提前谢谢

2 个答案:

答案 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并查看符号的正确拼写。