Передать указатель на array в программу.

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

Передать указатель на array в программу.

Сообщение MEMBER » 28.03.2004 (Вс) 18:47

Имеем dll которая получает указатель на array и может с ним работать. Как из dll запустить программу и передать ей указатель на array.
ЗЫ Как запустить программу писать не надо. Надо, панимашь, комплексно. :)
Спасибо.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

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

Сообщение GSerg » 29.03.2004 (Пн) 8:03

Элементарно. Byref arr(lbound(arr)) или Byval varptr(arr(lbound(arr))).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 29.03.2004 (Пн) 13:44

Это пойдёт как параметр командной строки?
Или сначала надо будет дождаться, пока программа запуститься?
И ещё вопрос, это в какую функцию\процедуру уйдёт-то?
---
ЗЫ Не делал я такого, потому и пристаю.
Поэтому чуть подробней, если можно.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

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

Сообщение GSerg » 29.03.2004 (Пн) 13:47

Ого! :)
Тогда поподробней, плз. Как это - получить указатель на массив, чьё имя задано ключом строки?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 29.03.2004 (Пн) 13:58

Нет, ну я же написал "или дождаться запуска программы".
Давайте плясать от печки.
Есть запущенное приложение, есть dll, надо из dll отправить указатель на массив в приложение.
Вот. ;)
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

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

Сообщение GSerg » 29.03.2004 (Пн) 14:07

Ага, так это activex dll :)
Ну тогда встаёт проблема взаимного управления. Которая рассматривалась подробно, но не найдёт её никто никогда :(

Короче. Приложение создаёт экземпляр класса из библы. А этот класс должен содержать метод, через который передаётся массив, обычный GetArray(arr()).

Или я опять не понял?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 29.03.2004 (Пн) 14:49

Ага... Мысль.
Принцип:
VBScript создаёт массив, передаёт указатель на массив в dll, dll запускает программу, дожидается её запуска, после запуска программы она (программа) создаёт экземпляр класса из dll, получает указатель на массив, обрабатывает его.
Вот меня смущать начинает отсюда: "после запуска программы она (программа) создаёт экземпляр класса из dll, получает указатель на массив"
---
Ладно, теорию надо практикой проверять, вот и проверю.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 29.03.2004 (Пн) 16:53

Киньте что-ли в меня ссылкой на проект, который это делает, или описанием, как это делать.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

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

Сообщение GSerg » 30.03.2004 (Вт) 10:33

MEMBER, бывалоча, как спросит... :wink:
Но марку держать надо :)
Итак...

Тут два основных пути. Первый – это то, что запускаемая из dll программа является activex exe, а значит можно ей определить публичный интерфейс с методом GetArray и вызвать сей метод из dll.

Второй – это когда программа обычный exe. Тут интереснее. Потому что получить указатель на массив извне в виде числа можно, но работать с ним крайне геморно – это либо прямая арифметика с указателями через CopyMemory, либо прямой вызов функций работы с SAFEARRAY, что, мне кажется, предпочтительнее. Кроме того, встаёт проблема выбора способа межпроцессной коммуникации, коих не один. И третья проблема – когда процесс подгружает себе библиотеку, она маппится в его адресное пространство, а когда библиотека запускает процесс, адресное пространство создаётся новое, и указатель на массив не имеет смысла для запущенной программы, поскольку не относится к её адресному пространству. Так что для чтения этого массива придётся применять ReadProcessMemory – ох и гемор же...

Попробуем так. Пусть dll запускает программу с параметром командной строки в виде числа varptr(arr(lbound(arr))) (первый) и ID процесса dll (второй). Первое число есть не что иное как SAFEARRAY**. Размер этой структуры, думаю, найдёшь... Теперь, зная размер и указатель, копируем эту структуру себе через ReadProcessMemory (причём сначала мы читаем по этому адресу четыре байта – это новый адрес! и вот из него уже копируем). Теперь имеем структуру у себя. В ней есть вся информация для функции SafeArrayCreate. Вызываем её. Получаем указатель на пустой SAFEARRAY с теми же характеристиками, но уже в нашем адресном пространстве. И тогда просто делаем ещё разок ReadProcessMemory, на сей раз подставив в качестве pDest byval Safearray.pvData новой структуры, а в качестве pSource – аналогичный член скопированной структуры.

НО
Всё написанное является плодом моего воображения, хотя, в принципе, может работать :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение GSerg » 30.03.2004 (Вт) 10:52

Спорол чушь в одном месте, сейчас, соберусь с мыслями и исправлю...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 30.03.2004 (Вт) 10:52

А что, вопрос слишком тупой? Ну это, звиняйте...
Буду изучать и, как пишут некоторые, пробЫвать. Спасибо.
:)
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

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

Сообщение GSerg » 30.03.2004 (Вт) 10:53

Да нет, батенька, вопрос слишком не тупой!

Такой вот у меня вопрос: массив одномерный?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение GSerg » 30.03.2004 (Вт) 12:13

Короче, не получается ни фига.
OpenProcess с флагом VM_READ работает, хэндл возвращает.
А ReadProcessMemory не читает, возвращает ноль, что значит доступ закрыт.
И даже если вызывающий процесс с помощью VirtualProtect разрешает полный доступ к нужному куску памяти (завершается успешно!), то всё равно не читает.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение GSerg » 31.03.2004 (Ср) 5:34

Нет, всё-таки задача интересная :)
А потому вот решение.

Здесь я закрываю shared memory object сразу после использования, но можно и не закрывать - тогда останется кусок общей памяти у двух процессов.
Вложения
Передача массива.zip
Interprocess SAFEARRAY interchange
(10.69 Кб) Скачиваний: 30
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 01.04.2004 (Чт) 20:21

Спасибо, буду пробовать.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com


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

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

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

    TopList