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

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

03.03.2014, 18:13. Показов 1476. Ответов 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
Модератор
10055 / 3900 / 884
Регистрация: 22.02.2013
Сообщений: 5,851
Записей в блоге: 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
Модератор
10055 / 3900 / 884
Регистрация: 22.02.2013
Сообщений: 5,851
Записей в блоге: 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
Модератор
10055 / 3900 / 884
Регистрация: 22.02.2013
Сообщений: 5,851
Записей в блоге: 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
Модератор
10055 / 3900 / 884
Регистрация: 22.02.2013
Сообщений: 5,851
Записей в блоге: 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
Модератор
10055 / 3900 / 884
Регистрация: 22.02.2013
Сообщений: 5,851
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru