调用DLL函数的问题

发布于 2024-11-06 05:42:51 字数 1857 浏览 0 评论 0原文

代码:

    #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); 行处; (第一次调用函数)

它冻结并给我以下

未处理的异常 at 0x00000000 in test_trans_new.exe: 0xC0000005: 访问冲突读取位置 0x00000000。

我想这是因为函数指针指向 NULL 但我不知道如何修复它

我使用 Visual C++ 2010

提前感谢

您的所有回复,这些回复确实很有帮助,但问题仍然存在,但我大致知道原因如果我纠正问题是我尝试访问的函数是 COM 类型,所以关于使用这种类型的任何想法
提前致谢

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 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);




}

in this code i call a dll it load successfully but when i try to use any function it compile without any errors but at the line

EnableLastCharTashkeel_function(true); (first call for a function)

it froozes and give me the following

Unhandled exception at 0x00000000 in test_trans_new.exe: 0xC0000005: Access violation reading location 0x00000000.

i guess that this becuse the function pointer point to NULL but i don't know how to fix it

i use visual c++ 2010

thanks in advance

thank you for all your replies which are realy helpfull but the problem still ocurrs but i approximately know the reason if i correct the problem is that the functions i try to access are of type COM so any idea about using this type
thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

Saygoodbye 2024-11-13 05:42:51
 FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel");

这是有保证的 NULL。调用它确实会失败,您没有检查该函数是否成功。导出的函数未命名为“EnableLastCharTashkeel”。更可能的字符串是“?EnableLastCharTashkeel@@YAX_N@Z”。这是 C++ 编译器修改后的函数名称,这是支持重载函数的技巧。

您可以声明函数 extern "C",它会抑制名称修改并使函数名称为“_EnableLastCharTashkeel”。请注意前导下划线,32 位编译器使用它来标记该函数使用 __cdecl 调用约定。可以肯定的是,从 Visual Studio 命令提示符对 DLL 运行 Dumpbin.exe /exports,它会显示导出的名称。

 FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel");

That's a guaranteed NULL. Calling it does go kaboom, you didn't check if the function succeeded. The exported function is not named "EnableLastCharTashkeel". A more likely string is "?EnableLastCharTashkeel@@YAX_N@Z". That's the name of the function after the C++ compiler mangled it, a trick to support overloaded functions.

You can declare the function extern "C", that suppresses name mangling and makes the function name "_EnableLastCharTashkeel". Note the leading underscore, used by the 32-bit compiler to mark that the function uses the __cdecl calling convention. To be sure, run Dumpbin.exe /exports on your DLL from the Visual Studio Command Prompt, it shows the exported names.

暮光沉寂 2024-11-13 05:42:51

它很可能是 0,因为未找到您试图在 DLL 中查找的符号,这表明 (a) 它不存在或 (b) 函数名称中可能存在拼写错误或 (c) 函数name 可能会被破坏,因为它是作为修饰名称导出的。这种情况在 C++ 中经常发生...

除非导出这四个函数的库在您的控制之下,否则请使用 dumpbin /EXPORTS 并查看符号的正确拼写。

It's most likely 0 because the symbol you were trying to find in the DLL wasn't found, which would suggest that (a) it's either not there or (b) there might be a typo in the function name or (c) the function name might be mangled because it's being exported as a decorated name. This happens quite a lot in C++...

Unless the library exporting those four functions is under your control, use dumpbin /EXPORTS and have a look at the correct spelling of the symbols.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文