Dll на С++

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Dll на С++

Сообщение Ariman » 26.02.2005 (Сб) 19:37

Чего-то никак не могу к проге на ВБ подключить свою дллку, написанную на с++! В общем, для примера специально написал простую функцию:

Код: Выделить всё
long __export Calc(int a, int b, int c)
{
return a*a+2*b+c;
}


TDUMP выдает следующее:

Exports from Project1.dll
2 exported name(s), 2 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
000012D0 1 0000 Calc(int, int, int)
000090F8 2 0001 ___CPPdebugHook

- тоже вроде все впорядке.
В ВБ пишу:

Код: Выделить всё
Private Declare Function Calc Lib "project1.dll"  (a As Integer, b As Integer, c As Integer) As Long

Private Sub Command1_Click()
Debug.Print Calc(1, 2, 3)
End Sub


Говорит - нет такой функции, "Сan not find dll entry point Calc"

Если пробовать не по имени, а по номеру, т.е.

Код: Выделить всё
Private Declare Function Calc Lib "project1.dll" Alias "#1"  (a As Integer, b As Integer, c As Integer) As Long

Private Sub Command1_Click()
Debug.Print Calc(1, 2, 3)
End Sub


Говорит - Bad dll calling convention.

Что нужно делать, чтобы присоединить ее(ДЛЛку) по-нормальному?

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 26.02.2005 (Сб) 19:47

Вызов типа __stdcall пропиши :)
Моду создают модоки, а распространяют модозвоны.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 26.02.2005 (Сб) 19:49

Легче не стало :?
Единственное изменене - ТДамп пишет __stdcall Calc(int, int, int)

D'alex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 144
Зарегистрирован: 08.05.2004 (Сб) 20:11
Откуда: Moscow

Сообщение D'alex » 26.02.2005 (Сб) 20:04

Попробуй так:
Код: Выделить всё
Private Declare Function Calc Lib "project1.dll" Alias "CALC"  (a As Integer, b As Integer, c As Integer) As Long

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 26.02.2005 (Сб) 20:09

Честно говоря я даже и не думал что это сработает. Но все равно проверил и получил ожидаемое Сan not find dll entry point CALC

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 26.02.2005 (Сб) 21:13

По ординалу пробовал?
Код: Выделить всё
Private Declare Function Calc Lib "project1.dll" Alias "#1" (byval a As Long, byval b As Long, byval c As Long) As ???

А вот насчет возвращаемого типа у меня сомнения, если честно. У тебя какой именно Си? От этого будет зависеть, сколько байт в егойном long'е.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 26.02.2005 (Сб) 21:17

По ординалу пробовал?


Пробовал, пробовал:

Если пробовать не по имени, а по номеру, т.е.

Код: Выделить всё
Private Declare Function Calc Lib "project1.dll" Alias "#1"  (a As Integer, b As Integer, c As Integer) As Long

Private Sub Command1_Click()
Debug.Print Calc(1, 2, 3)
End Sub


Говорит - Bad dll calling convention.


Писал на BCB6

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 26.02.2005 (Сб) 21:25

У нас эта ошибка вываливалась, когда пытались декларировать функцию из cdecl-библиотеки. Так что я бы еще раз проверил, стоит у тебя там stdcall (или как он там у борланды называется - fastcall, что ли), или нет.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 26.02.2005 (Сб) 21:34

fastcall? Я написал вот так, а не работает.....


Код: Выделить всё
[b]long __export[/b] [b]__stdcall[/b] Calc([b]int[/b] a, [b]int [/b]b, [b]int [/b]c)
{
[b]return[/b] a*a+2*b+c;
}

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 26.02.2005 (Сб) 21:38

Ммм. А в настройках самого проекта это библы нет чего-нить аналогичного? Поройся, может и оказаться. Фишка просто в том, что одно дело - неправильная декларация, и совсем другое - неправильное соглашение о вызовах (calling convension). VB ищет свой единственно понимаемый stdcall и явно не находит...

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 26.02.2005 (Сб) 21:41

Да, есть в настройках. Так пункт и называется - calling convention
Стоит Standart Call.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.02.2005 (Сб) 22:41

Ennor писал(а):Так что я бы еще раз проверил, стоит у тебя там stdcall (или как он там у борланды называется - fastcall, что ли), или нет.

fastcall - это совсем-совсем другое, в VC он тоже есть.
Кроме того, в DLL явно нигде не прописана конвенция для каждой функции, т.ч. замечание "VB ищет свой единственно понимаемый stdcall и явно не находит" совершенно бессмысленно.
Дело в том, что экспортируемое имя декорируется, а в TDUMP, очевидно, есть встроенный раздекоратор, раз он ещё и типы параметров показывает.
Надо каким-то способом узнать настоящее имя функции (DUMPBIN, QuikView, F3 в Фаре, etc.), и прописать в "Alias" именно его.
Изображение

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 26.02.2005 (Сб) 22:50

Быстрый просмотр выдал мне вот что: @Calc$qqsiii
Это то что нужно? В любом случае, это ничего не дало - как было так и есть, невозможно найти функцию.......
К тому же, ведь я ни разу не видел, чтоб при подключении функций из, скажем, winGDI, приходилось писать что-нибудь эдакое....
Везде были нормальные имена...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.02.2005 (Сб) 23:24

Это потому, что GDI написан не на BCB ;-)

На самом деле, ты попробовал подставлять в алиас это "@Calc$qqsiii"?
И точно ли функция называется именно так?

Если библиотека не представляет коммерческой тайны - можешь выложить её, я посмотрю что там как ;-)
Изображение

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 26.02.2005 (Сб) 23:30

Да какая там тайна, я же сказал, писал для примера, чтоб проверить взаимодействие с вб :lol: . Код выложил в первом посте:

Код: Выделить всё
long __export Calc(int a, int b, int c)
{
return a*a+2*b+c;
}

И все!
Последний раз редактировалось Ariman 26.02.2005 (Сб) 23:33, всего редактировалось 1 раз.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 26.02.2005 (Сб) 23:32

А вот и длл-ка в раре:
Вложения
Project1.rar
(22.32 Кб) Скачиваний: 16

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.02.2005 (Вс) 0:03

Точно, "@Calc$qqsiii". И что, не работает? Сейчас проверю сам...
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.02.2005 (Вс) 0:06

Всё у меня работает. Ищи, что у тебя не так.
Код: Выделить всё
Option Explicit
Private Declare Function Calc Lib "project1.dll" Alias "@Calc$qqsiii" (ByVal a As Integer, ByVal b As Integer, ByVal c As Integer) As Long

Sub Main()
Debug.Print Calc(1, 2, 3)
End Sub


Ты, кстати, ByVal-ы пропустил ;-)
Изображение

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 27.02.2005 (Вс) 0:08

Ну что, работает? Кстати, даже если работает, можено как-нибудь имя в САМОЙ дллке на нормальное сменить????

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 27.02.2005 (Вс) 0:10

Черт, не в кассу......

А что с моим вопросом относительно имени???

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 27.02.2005 (Вс) 0:19

Кстати, разобрался я, что не так.....
Блин так и свихнуться не долго:
Скопировал твой код, проверил по-символьно - все совпадает, а не работает! Дважды проверил, вздохнул по-глубже, нажал RUN - не работает. Потом в голову закралась одна мысль. Переименовал я project1.dll в test.dll - оно и понятно, компиллятор все равно искал функцию в некоем project1.dll который был написан дааавным давно и, в отличие от той библы, которую я тут выложил, был зарегистрирован......... :roll:
Вот так.....

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 27.02.2005 (Вс) 0:27

Ariman писал(а):А что с моим вопросом относительно имени???

Моя тема с примером от GSerg'a
Листинги не горят!

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 27.02.2005 (Вс) 0:31

Честно говоря, у меня была кощунственная мысль, что так надо делать только в ВЦ, а билдер сам до этого дошел :D

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 27.02.2005 (Вс) 0:38

А я даже вспомнил, что меня на эту мысль натолкнуло....

You can use the __declspec(dllexport) or _export keywords in the definitions of export functions in your C and C++ source code to remove the need for an EXPORTS section. Note, however, that if __declspec(dllexport) or _export is used to export a function, that function is exported by name rather than by ordinal. Please also note that __declspec(dllexport) is the preferred method of export


Может я чего не так понял, но вроде если я использую _export, то уже не надо использовать *.def файл?

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 27.02.2005 (Вс) 0:44

Нашел наконец:
Use extern "c" to prevent function names from being mangled in C++ programs.

И без всяких дефов.

Код: Выделить всё
extern "C" long _export __stdcall Calc(int a, int b, int c)
{
return a*a+2*b+c;
}



Всем спасибо!

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 27.02.2005 (Вс) 15:20

При компиляции DLL вместо слова _export лучше использовать __declspec(dllexport). _export - уже устарело, у меня компилятор вообще его игнорировал.

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

А точку входа ВБ не может найти вероятно по тому, что в ДЛЛ функция называется малость по другому. Если поищешь в ДЛЛ исходное имя функции, то наверняка увидишь что-то вроде этого: ?CalcYGKJGHGH. Его и надо вписывать после Alias в ВБ.

У меня работало без проблем.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.02.2005 (Вс) 15:30

Arcanoid, проблема уже была решена.
Изображение

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 27.02.2005 (Вс) 22:47

Просто вторую страницу заметил уже после того как сделал пост... :oops: :oops:


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

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

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

    TopList  
cron