开发者

calling DLL functions problem

code:

 开发者_Go百科   #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


 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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜