Как вызвать программу, чтобы она вернула какое-то значение?

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

Как вызвать программу, чтобы она вернула какое-то значение?

Сообщение arthur2 » 02.04.2008 (Ср) 12:49

Как вызвать программу, передать ей на обработку какое-нибудь значение и получить его обратно?

Скажем, я запускаю программу, передаю ей число 2, она умножает его на два и возвращает мне 4.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 02.04.2008 (Ср) 14:21

Программа не функция, она ни чего не возвращает.
Создай расшаренный маппинг.
Перед запуском проги запиши туда исходные данные.
Запусти программу.
Дождись ее завершения.
Прочитай результат из маппинга.

Все.
А я все практикую лечение травами...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 02.04.2008 (Ср) 14:22

arthur2
msgbox 2*val(command$)

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 02.04.2008 (Ср) 14:23

Да, можно еще передавать данные в командной строке, но много ты таким способом не передашь...
А я все практикую лечение травами...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.04.2008 (Ср) 14:48

Twister писал(а):Да, можно еще передавать данные в командной строке, но много ты таким способом не передашь...

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

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 02.04.2008 (Ср) 14:55

может автору стоит обратить внимание на ActiveX DLL проект, создать свой класс с нужными ему функциями и уже в других программах его использовать.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 15:35

Twister

Программа не функция, она ни чего не возвращает.

Во-во! А как сделать, чтобы возвращала?
Что такое мапинг и как им пользоваться? можно ссылочку или кусочек кода?

В принципе, командная строка меня бы устроила, но это ведь как передать туда, а не обратно.

Mikle
:lol: Ну да, только чтобы результат отправился не куда-нибудь, а в вызвавшую программу.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 15:40

Viper
Здесь просто - запускаемая программа моя, что хочу то и делаю.
:o (пошёл на кирпичи за примером)

Konst_One
Нет, этот вариант мне не подходит.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.04.2008 (Ср) 15:52

А как сделать, чтобы возвращала?
Эээ... возвращала куда?

Имхо, автор хочет странного...
Лучший способ понять что-то самому — объяснить это другому.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 18:25

В туда же, из откуды вызвано:

x = dvajdyDva(2)

Function dvajdyDva(n As Integer) As Integer
'Как-то там вызываю внешнюю программу
Shell или ShellExecute или ещё чего
dvajDydva='как-то там получаю результат
End Function

Как-то так... :D

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.04.2008 (Ср) 18:50

arthur2
Ещё раз: программа - не функция.

Эта логика (делёж на вызывающую и вызываемую стороны) не применим к двум процессам (в том смысле, в котором ты имеешь ввиду, разумеется), как он применим к функциям.

Маппинг - это отображение дискового пространства на виртуальное адресное пространство процесса.

Если сделать в двух процессах маппинг одного и того же дискового пространства, то получится общая память у этих двух процессов (тогда как вообще в Windows у всех процессов своё АП).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 02.04.2008 (Ср) 19:42

Ну блин, какое узкое мышление. Нормальная ситуация, ничего странного.
Кстати, как вариант "передачи назад" - проще всего наверное создать атом и вернуть его идшник в exitprocesscode. Код получится наиболее короткий
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 20:26

Хакер
Я понял, что стандартного способа нет. Меня, как всегда, устроит эмуляция.

Ну пусть с маппингом - теоретически я красиво всё предтавил: две программы пользуются одним и тем же куском памяти. Ещё слишал такие красивые слова, как фиберы, атомы и симофоры :D

А практически?

Пример из кирпичей про отображение файла на память посмотрел. Этот способ, наверное, удобен, если нужно передавать большие объёмы данных. А если по чуть-чуть? И там ведь один положил, другой взял. Но никто не сообщает, что уже, мол, пора взять.

В "Популярных вопросах"
http://bbs.vbstreets.ru/viewtopic.php?t=14649
судя по описанию, что-то похожее на то, что надо, но... пример оттуда не качается. А спросить в том топике - ниизя

А если ActiveX EXE попробовать - такую программу нужно регистрировать, как библиотеку, или она сама при запуске прописывается? Можно ли её снаружи запустить и снаружи же убить? Вообще, чем она отличается от обычного экзешника?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 20:29

ANDLL
О, тебя-то мне и надо! В топике
http://bbs.vbstreets.ru/viewtopic.php?t=14649
Не кочается твой пример.

Да, и вот на этот:
http://bbs.vbstreets.ru/viewtopic.php?t=12444
тоже хотелось бы посмотреть :lol:

А про атом - можно чуть подробнее? Или где посмотреть? Очень похоже, что это как раз то, что я смутно ищу

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.04.2008 (Ср) 20:36

Атом - это особое 16-битное число, соответсвующее строке в особой таблице. Строка при этом может быть не длиннее 255 символов.

Атомы глобальны для рабочей станции. Их можно добавлять/удалять, искать атом по его имени (строке, ассоциированной с атомом).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 22:10

Хакер
То есть, зная строку, я могу посмотреть значение, или наоборот, зная значение, строку? И то и другое я сам задаю? Строка в особой таблице и имя атома - одно и то же? И как всё это осуществить.

Как я понял:
1. Создаю атом с именем "вася", кладу в него значение 10, запускаю программу

2. Программа смотрит значение атома "вася", умножает его на 100, пишет результат в атом "вася" и умирает.

3. Я дожидаюсь, пока программа умрёт, и забираю из "вася" результат.

Так?

Что такое exitprocesscode (слово поисковики не знают)?

Если можно, чуть больше конкретики: как эти атомы создавать и с чем их есть?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 02.04.2008 (Ср) 22:34

Если твоя программа должна обмениватся 4-байтовыми числами, то не нужны атомы.
Нужно просто класть ответ в exit code. Что бы положить надо вызвать ExitProcess(code). Что бы узнать - GetExitCodeProcess
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 02.04.2008 (Ср) 23:23

Предполагаю, что ты пишешь Shell Extension (если это не так, то всё написанное дальше - скорее всего, не в тему). У тебя есть две программы - основная прога и Extension. Extension вызывается оболочкой и должен проанализировать каким-то образом файл (например) и выдать что-то на экран, связанное с этим файлом. Так как анализировать файл умеет и сама основная программа и код этого анализа занимает добрых 3/4 её размера, то тебе не хочется этот код копировать в Extension, а хочется запустить основную программу, чтобы она его проанализировала, вернула ответ Extension'у, а тот вывел информацию на экран. В таком случае, думаю, лучше будет сделать что-то типа такого: создать DLL, поместить в неё код анализа файла и сделать так, чтобы и Extension, и основная прога пользовались этой DLL (я ни разу не писал DLL, хотя очень многое о них знаю, поэтому, возможно, где-то что-то сказал не то). Но если информации передавать нужно немного, то, скорее всего, лучший вариант - с командной строкой и exit code.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 23:28

ANDLL
Спасибо! Вроде, работает, но...
Вот так я кладу код возврата:

Код: Выделить всё
Option Explicit
Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)

Sub Main()
MsgBox "kk"
'DoEvents
  ExitProcess 100
End Sub


Если в этом варианте, то при вызове из второй программы GetExitCodeProcess даёт то, что положил, 100

Но! Если закомментировать меседжебокс, то GetExitCodeProcess уже читает 0

Пытался вместо бокса влепить дуэвент, но тчетно. В чём тут может быть дело?

Про атомы мне всё равно интересно: я вообще правильно понял? Можно ли с их помощь. обмениваться небольшими строками? Или ещё чем-нибудь? И как!

З.Ы. Посмотри на три топика выше: там ссылки на твои примеры, которые не скачиваются :cry:

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 03.04.2008 (Чт) 1:53

arthur2, и все таки мне не не понятно, чем не устроил ActiveX EXE ? Он вроде делает то, что нужно с наименьшими трудозатратами и с большой надежностью.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 03.04.2008 (Чт) 9:55

Александр Дмитриев
Ага, ты всё правильно понял: это расширение, контекстное меню любых файлов. Но работать онo должнo не c одной конкретной программой, а с любой.

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

Для стандартных задач абсолютно не нужно, чтобы программа сама общалась с расширением (эта часть у меня уже готова). Что написано в файле конфигурации, то и выводится в меню.

Но если программа хочеть помечать свои пункты галочками или менять заголовок пункта в зависимости от содержания файла, она должна как-то сообщать моему расширению, чего она хочет от конкретного пункта.

Matew
Мне предложили активХ длл, и это мне не подходит. А на актив ЕХЕ я как раз посматриваю. Но некоторые моменты с ним мне не ясны (чуть выше в теме я уже спрашивал)

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 03.04.2008 (Чт) 11:30

плагины обычно пишуться на ActiveX DLL. зачем велосипед то изобретать :shock:

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 03.04.2008 (Чт) 20:36

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

Расширение - само по себе уже длл. Если чтобы читать инфу из файлов, оно будет от каждой из программ требовать ещё по длл, то всё это получится слишком уж запутано. Хотя, может быть я так и зделаю, но по этому способу у меня вопросов пока нет. Пока надеюсь с ним не связываться :lol:
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.04.2008 (Пт) 1:48

arthur2
Какие-то предрассудки.

Делать плагины так, как их собираешься делать ты, это жутки изврат. Ну я не знаю, всё равно что спать в туалете.

Если чтобы читать инфу из файлов, оно будет от каждой из программ требовать ещё по длл, то всё это получится слишком уж запутано.

Будет ничуть не менее запутанней, чем у тебя, но на порядок наждёжнее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 04.04.2008 (Пт) 10:28

Хакер
Я не хочу, чтобы это были плагины и пытаюсь придумать, как без плагинов обойтись. Но в общем, да, убедили - вероятно, эту конкретную задачу лучше решать длл-ками. Проехали.

Но мой вопрос был несколько шире моей сейчашной задачи. Я же пытаюсь объяснить - как присобачить длл, более-менее понятно. А вот как передать данные с атомами - мне интересно.
Артур
 
   

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 04.04.2008 (Пт) 10:42

Можно просто передавать через файл, открытый с общим доступом.


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

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

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

    TopList