С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для Kverter
37 / 37 / 25
Регистрация: 30.10.2013
Сообщений: 211

Передача ссылки в функцию из длл С++

03.03.2014, 18:13. Показов 1462. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!!! Нужна помощь.
В общем есть ДЛЛ написанная мною на плюсах в VS 2005,она подключается к проекту на vb 6.0. Сейчас все работает отлично,но нужно сделать так чтоб функция в библиотеке возвращала не одно а 3 значения при чем разных типов. Как такое реализовать? хотел с помощью ссылок но что-то тут не ладное....
вот так подключаю в проекте на ВБ
Visual Basic
1
Private Declare Function test Lib "FinalLib.dll" Alias "_test@4" (ByRef a As Integer)
как видно передается ссылка....в С++ следующая функция принимает ее(должна принимать)
C++
1
2
3
4
5
extern "C" __declspec(dllexport)  void CCONV test (int& rt)
{
    rt=6*6;
 
}
по логике вроде в ячейке должно изменится значение что повлечет за собой изменение значения переменной в ВБ, но почему то не работает...Может быть проблемма в том что в вб адрес 32х разрядный?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2014, 18:13
Ответы с готовыми решениями:

Передача ссылки и указателя в функцию
передал ссылку в одну функцию - нормально, передал в другую - выводит неверное значение, тоже самое с указателем. Как можно это исправить?

Передача ссылки в функцию в DLL
Здравствуйте. По этому мануалу сделал DLL https://msdn.microsoft.com/ru-ru/library/ms235636.aspx Возникла проблема с передачей...

Передача ссылки на массив в функцию
запутался в 3 соснах... Помахайте плиз) //обьявляю и инициализирую функцию void fShow(char *pNameArray){ for (int i = 0; i...

12
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
03.03.2014, 18:31
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Конечно причина не в этом, но попробуйте вместо as Integer объявлять переменную as Long


Long VB6 в соответствует int C++
1
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
03.03.2014, 21:42
void - Sub, а не Function (это для справки)
Передавать нужно, как пишет Softice - Long.
Что не именно не получается? Как определен идентификатор CCONV?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
04.03.2014, 06:52
Цитата Сообщение от Kverter Посмотреть сообщение
возвращала не одно а 3 значения при чем разных типов. Как такое реализовать?
А если задействовать пользовательский тип, вроде того:
Visual Basic
1
2
3
4
5
Type Price
Name As String
Kolichestvo As Long
Cost As Single
End Type
Можно сколько угодно переменных возвращать. В С++ это структурой зовется.
0
 Аватар для Kverter
37 / 37 / 25
Регистрация: 30.10.2013
Сообщений: 211
04.03.2014, 10:15  [ТС]
Кроме этой функции есть еще которые объявлены вот так:
Visual Basic
1
2
3
4
Private Declare Function Group Lib "FinalLib.dll" Alias "_getDomainUserGroups@4" (ByVal a As String) As String
Private Declare Function sAMAccountName Lib "FinalLib.dll" Alias "_getDomainUserSAMAccountName@0" () As String
Private Declare Function userPrincipalName Lib "FinalLib.dll" Alias "_getDomainUserPrincipalName@0" () As String
Private Declare Function userDisplayName Lib "FinalLib.dll" Alias "_getDomainUserDisplayName@0" () As String
они отрабатывают.
думал сделать как говорит Pro_grammer но вылетает ошибка что пользовательский тип не определен..Может я где то не там объявляю его? вот весь код на вб
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function Group Lib "FinalLib.dll" Alias "_getDomainUserGroups@4" (ByVal a As String) As String
Private Declare Function sAMAccountName Lib "FinalLib.dll" Alias "_getDomainUserSAMAccountName@0" () As String
Private Declare Function userPrincipalName Lib "FinalLib.dll" Alias "_getDomainUserPrincipalName@0" () As String
Private Declare Function userDisplayName Lib "FinalLib.dll" Alias "_getDomainUserDisplayName@0" () As String
Private Declare Function test Lib "FinalLib.dll" Alias "_test@4" (ByRef a As Integer) As Price
Private Sub Result_Click()
Type Price
Name As String
Kolichestvo As Long
Cost As Single
End Type
Dim Str As String, NewStr As String, NewStr2 As String, NewStr3 As String
Dim k As Long
Dim i As Integer
i = 1
k = 2
'Set k = ks
'Dim l As String
'NewStr = Group()
 Dim lb As Long, pa As Long
    lb = LoadLibrary("FinalLib.dll")
 
    MsgBox "Library address: " & lb
 
    FreeLibrary lb
'MsgBox "sAMAccountName: " & sAMAccountName
Str = Text2.Text
Text1.Text = sAMAccountName
Text2.Text = userPrincipalName
Str = Text4.Text
Text3.Text = Group(Str)
Text5.Text = userDisplayName
MsgBox "I address: " & VarPtr(i)
test (i)
Text6.Text = i
 
End Sub
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
04.03.2014, 10:41
Тебе написали передавай параметр As Long в твоей функции test. Твоя функция test объявлена как void - она ничего не возвращает. Если тип параметра может менятся, то его нужно объявлять как As Any - соответствует * void
0
 Аватар для Kverter
37 / 37 / 25
Регистрация: 30.10.2013
Сообщений: 211
04.03.2014, 11:11  [ТС]
То есть я должен написать
Visual Basic
1
Private Declare Function test Lib "FinalLib.dll" Alias "_test@4" (ByRef a As Any)
чтобы передать адрес памяти в с++?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
04.03.2014, 11:19
То что ты написал эквивалентно
C++
1
__declspec(dllexport) VARIANTARG __stdcall test(*void arg);
Теперь смотри где твоя ошибка
0
 Аватар для Kverter
37 / 37 / 25
Регистрация: 30.10.2013
Сообщений: 211
04.03.2014, 11:24  [ТС]
Если я напишу
Visual Basic
1
Private Declare Function test Lib "FinalLib.dll" Alias "_test@4" (ByRef a As  Long)
будет эквивалентно?
C++
1
__declspec(dllexport) VARIANTARG __stdcall test(int *arg);
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
04.03.2014, 11:31
Да. Но ты можешь не писать ByRef, т.к этот способ передачи по умолчанию в vb6
Visual Basic
1
Private Declare Function test Lib "FinalLib.dll" Alias "_test@4" (a As  Long)
0
 Аватар для Kverter
37 / 37 / 25
Регистрация: 30.10.2013
Сообщений: 211
04.03.2014, 11:41  [ТС]
Ну в с этим вроде разобрался.... теперь в с++ пытаюсь изминить значение по переданному из ВБ адресу
сл способом
C++
1
2
3
4
5
6
extern "C" __declspec(dllexport)  void CCONV test (int*rt)
{   
 
    *rt=6*6;
 
}
но получаю
Access violation reading location 0x840105e9
в чем проблема???
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
04.03.2014, 11:45
Блин, ты издеваешься? Что за void? Если делаешь void, то делай void и в VB6, т.е. Sub, а не Function. Каким образом вызываешь функцию из VB?
1
 Аватар для Kverter
37 / 37 / 25
Регистрация: 30.10.2013
Сообщений: 211
04.03.2014, 12:13  [ТС]
А что вместо void если функция ни чего не возвращает????
вызываю просто как test(arg)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.03.2014, 12:13
Помогаю со студенческими работами здесь

Передача ссылки на обьект класса в функцию
Определен класс в хэддере: class List{ public: //... void Add(const List *list); //... Метод Add:

Передача в функцию - ссылки, указатели, константы
Вот программа: #include <iostream> void fun(int &rhs) { rhs++; } int main()

Передача ссылки на функцию класса Виджет в другой класс
Будет ли работать если передать ссылку на функцию от класса Виджет в класс который не виджет. Ситуация такая есть виджет и у него есть...

Передача данных инжектированной длл
Есть длл, которая при помощи программы инжектится в несколько процессов и что-то там перехватывает, в моём случае openprocess. Нужно как-то...

Странный порядок вызова конструкторов и передача временного обьекта в функцию в качестве неконстантной ссылки
Есть код //g++ 5.4.0 #include <iostream> struct foo { foo(int){std::cout << "int ctor" << std::endl;} foo()...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru