调用 DLL 函数问题

calling DLL functions problem

本文关键字:问题 函数 DLL 调用      更新时间:2023-10-16

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