- Код: Выделить всё
hLib=loadLibrary ("TEST.dll")
hFunc = GetProcAddress(hLib, "?BootARM@CDVBBoardControl@@QAE?AW4DVB_ERROR@@PAVCString@@@Z")
hFunc - всегда равен 0, название функции записано правильно
hLib=loadLibrary ("TEST.dll")
hFunc = GetProcAddress(hLib, "?BootARM@CDVBBoardControl@@QAE?AW4DVB_ERROR@@PAVCString@@@Z")
ANDLL писал(а):А она-то функция экспортируемая?
ANDLL писал(а):Не, ну если hlib не нуль, и функция названа верно то hfunc то же не нуль будет.
ANDLL писал(а):Да, ну а что все же в lasterror?
Хакер писал(а):Функции не находятся ещё и тогда, когда они идут в таблице экспорта в неправильном (не алфавитном) порядке.
Хакер писал(а):Какая разница функции GetProcAddress, что экспортируется?
Где и как объявлена GetProcAddress?
Option Explicit
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Sub Command1_Click()
Dim hLib As Long
Dim hFunc As Long
hLib = LoadLibrary("test.dll")
hFunc = GetProcAddress(hLib, "??_C@_0CN@DILD@Too?5many?5bytes?5outstanding?5?9?5Fil@")
MsgBox hFunc
End Sub
Option Explicit
Private Declare Sub InitFastCRC32 Lib "test.dll" Alias "?InitFastCRC32@ATLData@@QAEHPADH@Z" (s As Long)
Private Sub Command1_Click()
InitFastCRC32 128
End Sub
jangle писал(а):Однако как их вызывать из DLL? Если просто как обычную C-функцию, программа сваливается с GPF.
- Код: Выделить всё
Option Explicit
Private Declare Sub InitFastCRC32 Lib "test.dll" Alias "?InitFastCRC32@ATLData@@QAEHPADH@Z" (s As Long)
Private Sub Command1_Click()
InitFastCRC32 128
End Sub
Это вобщем понятно, C++ класс нельзя вызвать из DLL просто как C-функцию. Его нужно как-то инициализировать, выделить память и т.п. Вопрос - можно ли это сделать из VB?
...
/* используем класс: ну что ж, вы сами этого хотели... */
/* 1: получаем адрес конструктора */
// использование typedef исключительно для красоты - см. ниже пример без typedef
typedef void (CSummator::*PConstructor)(int);
// объявляем указатель на член-функцию
PConstructor pConstructor = NULL;
// "обманываем" компилятор
*(FARPROC*)&pConstructor = GetProcAddress(hModule, "CSummatorConstructor");
_ASSERT(pConstructor != NULL);
/* 2: создаем (вручную) объект данного класса */
// объект на стеке
char p_ch1[sizeof(CSummator)];
CSummator& sum1 = *(CSummator*)p_ch1;
/* 3: теперь мы можем вызвать конструктор для данного объекта! */
(sum1.*pConstructor)(10);
/* 4: теперь можем использовать метод созданного класса! */
int (CSummator::*pAdd)(int);
*(FARPROC*)&pAdd = GetProcAddress(hModule, "CSummatorAdd");
_ASSERT(pAdd != NULL);
(sum1.*pAdd)(20);
/* 5: и не забываем, конечно же, вызвать деструктор! */
void (CSummator::*pDestructor)();
*(FARPROC*)&pDestructor = GetProcAddress(hModule, "CSummatorDestructor");
_ASSERT(pDestructor != NULL);
(sum1.*pDestructor)();
...
Сейчас этот форум просматривают: Bing-бот и гости: 13