Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возвратить результат в запускающую программу 
V
    Опции темы
mspuz
Дата 2.3.2006, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



У меня есть программа(А), которая по таймеру запускает другую программу(В). В программе В возможны системные сбои и мне бы хотелось, чтобы после отработки, программа В возвращала результаты - все хорошо, либо произошла ошибка. Как это осуществить??? Пока на уме лишь создание программой В файла txt, в котором будет подробный отчет, который программа А считывает и заносит в БД Журнал. Но наверняка есть что-то покруче!!!!
PM MAIL   Вверх
Guedda
Дата 2.3.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Есть, конечно.
Программой В послылай SendMessage программе А константу, а программой A принимай сообщения.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Snowy
Дата 2.3.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



1. Запускаешь программу через CreateProcess.
2. Ждешь ее завершения (примеры ожидания в FAQ)
3. Вызванную программу завершаешь по Halt(код);
4. В вызывающей программе получаешь этот код через GetExitCodeProcess.
PM MAIL   Вверх
mspuz
Дата 3.3.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



У меня могут быть различного рода ошибки и значение "завершился"-"незавершился" меня не совсем устраивают. Например Программа В не смогла выполнить SQL-запрос, она формирует сообщение, в котором сказанно в какой процедуре это произошло и саму строчку SQL-запроса и это все надо передать в программу А. Можно ли это организовать через SendMessage??? И еще, я запускаю программу через CreatProcess, но не могу ждать её завершения, т.к. мне нужно запускать другие программы паралельно и от них от всех получать отчеты о проделанной работе.
PM MAIL   Вверх
Guedda
Дата 3.3.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Создаешь константы типа:
Код

const
  MESSAGE_NOTSQL = $0001;
  MESSAGE_NOTDATA = $0002;
  //и так далее


Потом послыаешь это своей второй программе. Программа ловит SM, и сравнивает с константами. Вот и все.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
remax
Дата 3.3.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Все зависит от цели...
1) Проще всего и информативней (как, впрочем, mspuz и собирался), чтобы программа (запускаемая) вела файл протокола, например - в обычном текстовом файле при возникновении интересующих событий открываем на запись командой append, записываем подробно информацию, закрываем CloseFile. Поскольку формат данных произвольный - фиксирум все что необходимо вплоть до времени возникновения события.
2) Есть специальные средства(например, в библиотеке JEDI), позволяющие вести специализированный файлы протоколов типа .CSV. Их использование предпочтительней с точки зрения стандартизации и унификации. Кроме того, для них уже есть готовый инструментарий.
3) Если необходимо, чтобы вызывающая программа каким-то образом реагировала, то проще всего использовать предложенный Snowy подход через Halt/GetExitCodeProcess. Это вообще стандартные действия для объединения разных программ еще со времен DOS. В принципе, можно анализировать возвращаемый код даже в BAT-файлах. smile
4) Если во время работы запускаемой программы возникает необходимость неоднократной перадачи информации, то здесь лучше воспользоваться SendMessage, как предлагает Guedda . В принципе, с помощью этого подхода можно организовать даже обратную связь.




--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Демо
Дата 3.3.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



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

Решений такой проблемы предостаточно:
- Pipes
- Socket
- Messages
- Технологии COM/DCOM


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 3.3.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Поиск по форуму по слову WM_COPYDATA.
Никаких проблем с передачей любых данных между приложениями нет.
PM MAIL   Вверх
mspuz
Дата 3.3.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Блин, чето я туплю, ну никак не могу найти подробного описания WM_COPYDATA, подскажите что неправильно???
Отправляющая часть:

Код
var
hw:THandle;
cd:TCopyDataStruct;
begin
 hw:=FindWindow('TForm1','Ïðèíèìàþùèé');
 cd.dwData:=10;
 cd.cbData:=SIZEOF(Memo1.Text);
 cd.lpData:[email protected];
 SendMessage(hw,WM_COPYDATA,0,Integer(@cd));
end;


Принимающая часть

Код
var
 cds:PCopyDataStruct;
begin
 cds:=Msg.CopyDataStruct;
 Memo1.Text:=String(PCopyDataStruct(cds.lpData));
end;



Я использую Memo для примера, но на самом деле хочу использовать переменную типа TStringList, в которую помещу нужные данные и переправлю программе.
PM MAIL   Вверх
Snowy
Дата 3.3.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(mspuz @ 3.3.2006, 13:07 Найти цитируемый пост)
 cd.lpData:[email protected];
Так делать нельзя.
Сначала присвой текст в стринговую переменную, а потом ее передавай:
Код

 s:=Memo1.Lines.Text;
 cd.lpData:=pointer(s);

Добавлено @ 13:13
Вот пример передачи стринга из одной программы в другую:
http://forum.vingrad.ru/index.php?showtopi...st&p=642109
PM MAIL   Вверх
mspuz
Дата 3.3.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Snowy, YES!!!! Заработало!!! Обалдеть!!! Огромное спасибо!!! А можно для справки???
Что такое - cd.dwData
Какая разница между pointer и @ (сработало с pointer)
PM MAIL   Вверх
Romikgy
Дата 3.3.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(mspuz @ 3.3.2006, 12:41 Найти цитируемый пост)
pointer и @

имхо одинаково
Добавлено @ 13:52
Код

dwData

Specifies up to 32 bits of data to be passed to the receiving application. 



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 3.3.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(mspuz @ 3.3.2006, 13:41 Найти цитируемый пост)
Что такое - cd.dwData
Это любое число. Можешь его использовать, а можешь нет. Его можно использовать, например, для того, чтобы различать, что именно ты шлешь: строку, какую-то свою структури или что-то другое на свое усмотрение.
А можно вообще не использовать.

Цитата(mspuz @ 3.3.2006, 13:41 Найти цитируемый пост)
Какая разница между pointer и @ (сработало с pointer)
@ - это получить адрес.
а pointer - прямое преобразование переменной в поинтер.
То есть @s - даст нам указатель на переменную s.
А pointer(s) - даст нам указатель на первый символ строки. Аналогично можно сделать так: @s[1]
Верно и то и другое, но не @s - так мы получим указатель на указатель.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.5372 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.