c++ - 调用DLL函数问题

标签 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(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/

相关文章:

c++ - 在同一解决方案 C++ express 上的许多项目中更改平台工具集

c - 如何从主函数调用dll文件?

c++ - 如何在 OpenGL 中创建调试标记?

c++ - 在 C++ 中访问此指针地址的语法是什么?

python - 在 Python 中确定计算机是否通过 WiFi 网络或以太网电缆连接到互联网

javascript - Windows 10 S 用户代理字符串中的边缘?还有其他以编程方式检测 Windows 10 S 的方法吗?

c++ - 您能否仅使用一项服务将程序与 D-Bus 消息分开?

c++ - 类解构器和指针

java - 尝试用一个 .bat 文件启动两个 .bat 文件

c++ - 将 libtomcrypt 和 libtommath 添加到我的 C++ 项目中