проблема вызова функций DLL - PullRequest
0 голосов
/ 10 мая 2011

код:

    #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 (истина); (первый вызов функции)

он замерзает и дает мне следующее

Необработанное исключение в 0x00000000 в test_trans_new.exe: 0xC0000005: расположение чтения нарушения доступа 0x00000000.

Я предполагаю, что это потому, что указатель на функцию указывает на NULL, но я не знаю, как это исправить

Я использую Visual C ++ 2010

спасибо заранее

спасибо за все ваши ответы, которые действительно полезны, но проблема все еще возникает, но я приблизительно знаю причину, если я исправлю проблему, в том, что функции, к которым я пытаюсь получить доступ, имеют тип COM, так что любая идея об использовании этого типа * заранее спасибо

Ответы [ 2 ]

3 голосов
/ 10 мая 2011
 FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel");

Это гарантированный NULL.Вызов его идет kaboom, вы не проверили, если функция прошла успешно.Экспортируемая функция не называется «EnableLastCharTashkeel».Более вероятная строка - «EnableLastCharTashkeel @@ YAX_N @ Z».Это имя функции после того, как ее скомпилировал компилятор C ++, трюк для поддержки перегруженных функций.

Вы можете объявить функцию extern "C", которая подавляет искажение имени и делает имя функции "_EnableLastCharTashkeel".Обратите внимание на начальное подчеркивание, используемое 32-битным компилятором, чтобы отметить, что функция использует соглашение о вызовах __cdecl.Чтобы быть уверенным, запустите Dumpbin.exe / exports на вашей DLL из командной строки Visual Studio, он показывает экспортированные имена.

1 голос
/ 10 мая 2011

Скорее всего, 0, потому что символ, который вы пытались найти в DLL, не был найден, что говорит о том, что (a) его либо нет, либо (b) может быть опечатка в имени функции, либо (c) имя функции может быть искажено, потому что оно экспортируется как оформленное имя.Это часто случается в C ++ ...

Если библиотека, экспортирующая эти четыре функции, не находится под вашим контролем, используйте dumpbin /EXPORTS и посмотрите правильное написание символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...