запуск программы

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

запуск программы

Сообщение fallen » 15.04.2003 (Вт) 9:54

как передать в первую копию программы входящий параметр при запуске второй копии? в смысле вторая копия запускается с входящим параметром, который должна воспринять первая копия, а вторая копия должна завершиться. как в winamp'е, если выделить несколько файлов и нажать Play in Winamp.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 15.04.2003 (Вт) 16:30

посмотри на [url]vbrussian.com[/url] в примерах. что-то там проскакивало такое.
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2003 (Ср) 9:44

Смысл в том, что:
1. Программа запускается и проверяет, не запущен ли уже один ее экземпляр.
2. Если нет, то все. Если один экземпляр уже запущен, то она связывается с первым экземпляром и передает ей какие-то данные (например, параметры командной строки).

Естественно, вся загвоздка в обмене данными между двумя экземплярами программ. Есть шесть основных способа.
1. Через временные файлы. Т.е. прога с какое-то периодичностью сканирует определенный каталог, и если там появляются файлы (которые создаст второй экземпляр), то обрабатывает их и, после обработки, удаляет. Недостатки: криво, некрасиво и винт тарахтит.
2. То же, но через буфер обмена. Недостатки: криво, некрасиво и не сохраняется содержимое буфера.
3. То же, но через реестр. Недостатки: криво, некрасиво, засоряется реестр.
4. Использование механизма DDE. Недостатки: нужно регистрировать DDE-сервер.
5. Использование механизмов OLE (ActiveX-Server). Недостатки: слишком громоздко для небольшого приложения.
6. Обмен сообщениями через SendMessage. Элегантно, эффективно, но сложно.
6.1. Разновидность 6. На форме имеется невидимый TextBox, в котором на событии Change осуществляется обработка содержимого TextBox, в котором указываются команды и данные. А содержимое TextBox'а изменяет второй экземпляр программы (через API).
Lasciate ogni speranza, voi ch'entrate.

fallen
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.04.2003 (Вс) 22:06

Сообщение fallen » 16.04.2003 (Ср) 21:59

Просматривая пример из предыдущего ответа, я пришел к мысли, что вариант 6.1. является самым оптимальным. Только вот я ламер и не знаю как это сделать. Не подскажешь, как это организовать??? :roll:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.04.2003 (Чт) 10:03

Подсказать смогу, написать готовый пример -- нет :) В архивах не найти, а так, на ходу написать слишком много особенностей.

Но общай схема такова.
1. Размещаешь на форме невидимый TextBox, в свойство .Text указываешь какой-нибудь заранее определенный текст, например "<APP-DATA-EXCHANGE>".
2. В контексте формы нужно объявить следующие Private-переменные: ExchMode и ExchConfirm.
3. Когда форма загрузиласть, проверяешь на App.PrevInstance=True. Если нет, то больше ничего не делаешь. Если App.PrevInstance=True, то используется следующий алгоритм:
3.1. Ищешь хэндл окна экземпляра1 через API FindWindow.
3.2. В полученном хэндле ищешь хэндл нужного TextBox'а через API FindWindowEx (искать будешь по тексту "<APP-DATA-EXCHANGE>")
3.3. Все, у тебя имеется хэндл нужного TextBox'а. Устанавливаешь ExchMode=True. Записывать и считывать с него текст можно функциями API SetWindowText/GetWindowText.
4. Устанавливаешь соединение :) Например, записываешь в экз.1 строку вида "CONNECT, HWND=12345", где 12345 -- хэндл TextBox'а у экз.2 (чтобы экз.1 тоже мог "установить соединение")

Кроме того, в форме должен присутствовать обработчик событий примерно такого вида:
Код: Выделить всё
Private Sub txtDataExchange_Change()
Select Case ExchMode
  Case True
    'Работает экземпляр2.
    'Если получено подтверждение, то установить ExchConfirm=True
  Case False
    'Работает экземпляр1.
    'Прием и обработка команд.
End Select
End Sub


Разумеется, следует разработать какой-либо протокол обмена данными. Т.е. вначале оба экземпляра устанавливают соединение и т.п.
Lasciate ogni speranza, voi ch'entrate.

fallen
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.04.2003 (Вс) 22:06

Сообщение fallen » 18.04.2003 (Пт) 7:57

спасибо.

sslion
Постоялец
Постоялец
 
Сообщения: 334
Зарегистрирован: 12.04.2002 (Пт) 9:44
Откуда: Russia

Сообщение sslion » 18.04.2003 (Пт) 8:22

Я те щас пример вышлю - как это должно быть на самом деле...

sslion2000@mail.ru

Алекс
Обычный пользователь
Обычный пользователь
 
Сообщения: 84
Зарегистрирован: 30.04.2003 (Ср) 15:59
Откуда: Краснодар

Сообщение Алекс » 01.05.2003 (Чт) 6:59

Пусть вторая прога при запуске записывает данные в какой-то файл, а первая смотрит есть ли этот файл, и если есть читает данные.
При этом пусть вторая прога при выходе убивает этот файл.
Алекс.

ProgrammerVB
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 30.04.2005 (Сб) 18:36

Сообщение ProgrammerVB » 30.04.2005 (Сб) 19:01

Подскажите как запустить из своего приложения Project1.vbp :?:

Qubicz
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 16.10.2004 (Сб) 20:21
Откуда: Санкт-Петербург

Сообщение Qubicz » 01.05.2005 (Вс) 8:48

ShellExecute :?:

ProgrammerVB
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 30.04.2005 (Сб) 18:36

Сообщение ProgrammerVB » 02.05.2005 (Пн) 18:10

ShellExecute не работет выдает "sub or function not defined" :roll:

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 02.05.2005 (Пн) 19:05

ProgrammerVB

Сходи все таки по ссылке в моей подписи.

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

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 02.05.2005 (Пн) 20:27

ProgrammerVB писал(а):ShellExecute не работет выдает "sub or function not defined" :roll:


STFW
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)


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

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

Сейчас этот форум просматривают: Google-бот и гости: 52

    TopList