Нарушение доступа C ++ при вызове функции dll

0

Я фактически использую неуправляемую DLL C++, и у меня нет доступа к файлам.h,.cpp или.lib, но только к.DLL.

После использования PE Explorer и поиска функции, которую я хотел использовать, вот что я получаю:

@Tdtm_Dossier@Logon$qv; Index 1310; Unmangled Borland C++ Function: qualified function Tdtm_Dossier::Logon()

И вот что я получаю от использования dumpbin:

1310 11F9 00105234 @Tdtm_Dossier@Logon$qv

Вот исключение:

Unhandled Exception at 0x034B258C (modDll.dll) in functionsCpp.exe : 0xC0000005 : 
Access violation writting to 0x000000AC.

Код, который я использую для вызова и использования этой функции, следующий:

#include <stdio.h>
#include <Windows.h>
#include <iostream>

typedef int (*Logon)();

int main()
{
  HMODULE modDll;
  int resultLogon;
  modDll= LoadLibrary("C:\\dll\\modDll.dll");

  Logon logon;
  logon = (Logon)GetProcAddress(modDll,"@Tdtm_Dossier@Logon$qv");

  if(logon)
  {
    resultLogon = logon(); //<-- This is where I get the exception
    printf("Function has been loaded\n");
  }
  else
   // TODO: Error message

  FreeLibrary(modDll);
}

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

DLL правильно загружена, и GetProcAddress возвращает что-то. Я предполагаю (но я не уверен), что это имеет какое-то отношение к моему typedef, но я не могу понять, каков может быть тип возврата этой функции.

  • 0
    @cup Да, я проверил это и GetProcAddress тоже. Оба они не равны NULL.
  • 0
    Попробуйте использовать зависит, чтобы узнать, что подпись.
Показать ещё 1 комментарий
Теги:
dll
exception

1 ответ

1
Лучший ответ

Если вы прочтете, например, этот документ в названии Borland C++, вы можете понять, что имя символа "@Tdtm_Dossier@Logon$qv" представляет собой Tdtm_Dossier функцию-член класса Tdtm_Dossier. Вы не можете вызывать нестатические функции-члены как обычные функции, у них есть скрытый первый аргумент, который становится this указателем в функции-члене.

Вероятно, здесь происходит то, что функция-член Logon пытается получить доступ к переменным-членам экземпляра объекта, которых нет, что приводит к неопределенному поведению и сбою.

Чтобы иметь возможность использовать эту библиотеку, вам нужен файл заголовка и библиотека ссылок. Вы не можете просто вызвать функции (член или нет) и надеяться на лучшее.

  • 0
    Так что это означает, что я ДОЛЖЕН получить .h и .lib этой DLL, несмотря ни на что? Думаю, нет другого способа сделать это? Спасибо за ваш комментарий !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню