Вызов функций из C++ DLL

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Вызов функций из C++ DLL

Сообщение jangle » 16.02.2010 (Вт) 22:25

Никак не пойму, почему не находится функция из C++ DLL

Код: Выделить всё
  hLib=loadLibrary ("TEST.dll")
  hFunc = GetProcAddress(hLib, "?BootARM@CDVBBoardControl@@QAE?AW4DVB_ERROR@@PAVCString@@@Z")



hFunc - всегда равен 0, название функции записано правильно

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Вызов функций из C++ DLL

Сообщение ANDLL » 16.02.2010 (Вт) 23:18

А она-то функция экспортируемая?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Вызов функций из C++ DLL

Сообщение jangle » 16.02.2010 (Вт) 23:23

ANDLL писал(а):А она-то функция экспортируемая?


В экспорте она есть

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Вызов функций из C++ DLL

Сообщение ANDLL » 16.02.2010 (Вт) 23:26

Не, ну если hlib не нуль, и функция названа верно то hfunc то же не нуль будет. А что говорит err.lasterror?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Вызов функций из C++ DLL

Сообщение jangle » 16.02.2010 (Вт) 23:30

ANDLL писал(а):Не, ну если hlib не нуль, и функция названа верно то hfunc то же не нуль будет.


hfunc = 0, если было другое значение этого топика бы не существовало

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Вызов функций из C++ DLL

Сообщение ANDLL » 16.02.2010 (Вт) 23:31

Да, ну а что все же в lasterror?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вызов функций из C++ DLL

Сообщение Хакер » 16.02.2010 (Вт) 23:33

Функции не находятся ещё и тогда, когда они идут в таблице экспорта в неправильном (не алфавитном) порядке.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Вызов функций из C++ DLL

Сообщение jangle » 16.02.2010 (Вт) 23:37

ANDLL писал(а):Да, ну а что все же в lasterror?


там 0, разве может быть другое значение в этой ситуации?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Вызов функций из C++ DLL

Сообщение jangle » 16.02.2010 (Вт) 23:41

Хакер писал(а):Функции не находятся ещё и тогда, когда они идут в таблице экспорта в неправильном (не алфавитном) порядке.


Но C++ приложение использует эту DLL без проблем. Дело видимо в том, что экспортируются классы, а не обычные сишные функции.
Непонятно, можно ли использовать C++ классы из DLL в VB

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вызов функций из C++ DLL

Сообщение Хакер » 16.02.2010 (Вт) 23:42

Какая разница функции GetProcAddress, что экспортируется?

___

Где и как объявлена GetProcAddress?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Вызов функций из C++ DLL

Сообщение jangle » 17.02.2010 (Ср) 0:14

Хакер писал(а):Какая разница функции 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


Cам экспорт выглядит вот так, почему GetProcAddress возвращает 0 непонятно. Возможно GetProcAddress не работает в отношении С++ классов

Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вызов функций из C++ DLL

Сообщение Хакер » 17.02.2010 (Ср) 0:17

Вариант: в system32 лежит совсем левая test.dll, в которой такой функции конечно нет. Попробовать указать полный путь к своей библиотеке.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Вызов функций из C++ DLL

Сообщение jangle » 17.02.2010 (Ср) 1:38

Кажется разобрался в чем проблема, Dependency Walker добавляет лишние ?? в имя функции, поэтому она отображается неправильно

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Вызов функций из C++ DLL

Сообщение jangle » 17.02.2010 (Ср) 10:52

Теперь уже понятно, что проблема была в неправильном отображении имен экспортируемых классов в программе Dependency Walker. Вобщем при правильной записи экспортируемые классы находятся функцией GetProcAddress без ошибок.
Однако как их вызывать из 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?

P.S. Нашел описание почти моей проблемы, только к сожалению для BC++ :(

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Вызов функций из C++ DLL

Сообщение ANDLL » 17.02.2010 (Ср) 11:28

Прототип твоей функции отличается от того что ты написал
В частности функция ожидает указатель на экземпляр в регистре ECX
Создать экземпляр класса - это выделить под него память + вызвать конструктор, который то же должен экспортироваться.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Вызов функций из C++ DLL

Сообщение Vi » 17.02.2010 (Ср) 11:33

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?

>UNDNAME.EXE -f ?InitFastCRC32@ATLData@@QAEHPADH@Z
>> ?InitFastCRC32@ATLData@@QAEHPADH@Z == public: int __thiscall ATLData::InitFastCRC32(char *,int)

Это 1) член класса и 2) имеет другие параметры.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Вызов функций из C++ DLL

Сообщение jangle » 17.02.2010 (Ср) 11:47

Спасибо теперь понял. Конструктор C++ класса в VB надо "конструировать" вручную? Как и способы вызовов методов класса. Последние похоже вызываются посредством таблицы виртуальных методов (vtbl). Надо будет поковыряться у себя в завалах, может удасться найти исходник с подобной задачей.

p.s. Нашел пример явной загрузки класса из DLL на C++

Код: Выделить всё
...
/* используем класс: ну что ж, вы сами этого хотели... */
/* 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)();
...
Последний раз редактировалось jangle 17.02.2010 (Ср) 11:53, всего редактировалось 1 раз.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Вызов функций из C++ DLL

Сообщение ANDLL » 17.02.2010 (Ср) 11:53

Конструктор - это функция без возвращаемого значения.
Выделяется память и вызывается эта функция
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Вызов функций из C++ DLL

Сообщение jangle » 17.02.2010 (Ср) 20:28

Вопрос топика решился реквестом C++ программисту на написание враппера для VB, имхо самый разумный вариант...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing-бот и гости: 13

    TopList