Я фактически использую неуправляемую 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
, но я не могу понять, каков может быть тип возврата этой функции.
Если вы прочтете, например, этот документ в названии Borland C++, вы можете понять, что имя символа "@Tdtm_Dossier@Logon$qv"
представляет собой Tdtm_Dossier
функцию-член класса Tdtm_Dossier
. Вы не можете вызывать нестатические функции-члены как обычные функции, у них есть скрытый первый аргумент, который становится this
указателем в функции-члене.
Вероятно, здесь происходит то, что функция-член Logon
пытается получить доступ к переменным-членам экземпляра объекта, которых нет, что приводит к неопределенному поведению и сбою.
Чтобы иметь возможность использовать эту библиотеку, вам нужен файл заголовка и библиотека ссылок. Вы не можете просто вызвать функции (член или нет) и надеяться на лучшее.
GetProcAddress
тоже. Оба они не равны NULL.