Как испольбзовать dll написанную на C++?

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

Как испольбзовать dll написанную на C++?

Сообщение Kot22 » 02.10.2003 (Чт) 12:25

Есть бибилиотека - файл NewLib.dll Надо использовать функцию SetTestEx(strName as String) As Long
Описываю функцию в основном теле программы:

Private Declare Function getTotalEditTimeEx Lib "NewLib.dll" _
(ByVal strName As String) As Long
Вызываю данную функцию:
Dim a as long
Dim strTest as String
a = SetTestEx(strTest)
Но ошибка... :shock: Ошибка времени выполнения 453. Невозможно найти допуск в DLL SetTestEx in NewLib.dll
Где этот допуск установить?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.10.2003 (Чт) 15:12

Русифицированный VB у тебя что ли? Гадость какая.
В любом случае, декларируешь ты одну функцию, а вызываешь другую.
Кстати, ты уверен, что твой C++ функция ожидает именно BSTR? Скоре всего, она хочет LPSTR!
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kot22
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 02.10.2003 (Чт) 12:14

Сообщение Kot22 » 02.10.2003 (Чт) 22:36

Да, VB пока русский :(
Вот сделал маленькую тестовую dll на C++
long Test1(long a,long b)
{
long c;
c = a+b;
return c;
}//Просто складывает два числа
В VB проекте установил такой код:

Option Explicit

Private Declare Function Test1 Lib "TestDll.dll" _
(ByVal wType As Long, ByVal wName As Long) As Long


Private Sub cmdTest_Click()
Dim a As Long
a = Test1(1.8, 5.2)
End Sub

И таже ошибка... В чем может быть дело???

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.10.2003 (Пт) 4:10

http://old.vbstreets.ru/topic.asp?TOPIC_ID=6798

ЗЫ: Тело такой функции должно содержать всего одну команду: return a+b :wink:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kot22
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 02.10.2003 (Чт) 12:14

Сообщение Kot22 » 03.10.2003 (Пт) 10:30

Много чего интересного прочитал :)
Объявлении С++ функции выглядит так:

extern "C" _declspec(dllexport) long __stdcall getTotalEditTimeEx (char* pc_filename)

объявление в VB так:

Private Declare Function getTotalEditTimeEx Lib "FilePropEx.dll" _
(ByVal sFileName As String) As Long

Не понимаю, в чем может быть ошибка, связанная с несоответствием типов? :(

Kot22
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 02.10.2003 (Чт) 12:14

Сообщение Kot22 » 03.10.2003 (Пт) 11:06

Вот написал правильную функцию, чтобы быть уверенным, что с передачей данных все нормально:
extern "C" _declspec(dllexport) long __stdcall MyTest(long a,long b)
{
return a+b;
}
:)

Private Declare Function MyTest Lib "FilePropEx.dll" _
(ByVal x1 As Long, ByVal x2 As Long) As Long
Dim x1 As Long
Dim x2 As Long
x1=5.2
x2=4.8
TestLong = MyTest(x1, x2)
А результат тотже :(

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

Сообщение Vi » 03.10.2003 (Пт) 13:51

В С или С++ (не для VB будет сказано) используются измененные имена функций (так называемые mangled names), в которые упаковываются все спецификации функции. По каким правилам - это нужно читать МСДН. В твоем случае - _MyTest@8, т.е.
Код: Выделить всё
Private Declare Function MyTest Lib "FilePropEx.dll" Alias "_MyTest@8" _
(ByVal x1 As Long, ByVal x2 As Long) As Long

Или пользоваться DEF файлом, чтобы задавать свои имена.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Kot22
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 02.10.2003 (Чт) 12:14

Сообщение Kot22 » 03.10.2003 (Пт) 14:32

Огромное спасибо!
А где в MSDN посмотреть как C++ составляет имя функции?

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

Сообщение Vi » 06.10.2003 (Пн) 7:27

А где в MSDN посмотреть как C++ составляет имя функции?

Мазохист, да?! :)

Есть такая утилита, Depends называется (есть и другие, мне лично эта нравится), которая может показать все экспортируемые имена (т.е. известные снаружи). Там и видно, что сотворил компилятор с именем функции - вариантов там очень много.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

WEB_13
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 06.08.2003 (Ср) 8:02
Откуда: Reutov, Russia

Сообщение WEB_13 » 19.11.2003 (Ср) 2:28

Depends показывает весь список функций, а как же тогда узнать их параметры?
Format Hard Disk Completed

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

Сообщение Vi » 19.11.2003 (Ср) 12:31

Да уж VB для новичков :wink: ...

Есть такая утилита - UNDNAME.EXE. Вот она и покажет имя. Например,

>UndName.Exe ?MapDLLHappyFunc@@YAPADPAD@Z
>> ?MapDLLHappyFunc@@YAPADPAD@Z == MapDLLHappyFunc
>UndName.Exe -f ?MapDLLHappyFunc@@YAPADPAD@Z
>> ?MapDLLHappyFunc@@YAPADPAD@Z == char * MapDLLHappyFunc(char *)
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList  
cron