Форум » GUI » Как передать данные из одной программы в другую ? » Ответить

Как передать данные из одной программы в другую ?

Andrey: Всем привет... Есть ли механизм передачи данных между программами ? Допустим прога на МиниГуи запустила терминалку. Как узнать что терминалка нормально запустилась ?

Ответов - 59, стр: 1 2 3 All

Andrey: Петр пишет: Только не нужно его COMM - называть (у меня, почему-то ассоциация с COM портом, хотя понимаю, что это communication), лучше IPC (Inter-process communication). Да так Григорий назвал, не я. Спасибо !

Петр: SergKis пишет: Григорий постоянно оптимизирует либу, борется с лишними включениями. Замусорить легко, вычищать сложно. Ок. Я знаю позицию Григория. Лишнее или не лишнее - вопрос дискуссий.

Andrey: Вопрос дилетанта по окнам: SET EVENTS FUNCTION TO MYEVENTS можно назначать любому окну в программе ? И соответсвенно WM_COPYDATA будет обрабатываться в этом окне ? А то не хочу (неудобно) делать приёмку MAIN окном.


Петр: Andrey пишет: SET EVENTS FUNCTION TO MYEVENTS можно назначать любому окну в программе ? Нет Каждое окно в MiniGUI создается с оконной процедурой WndProc. При запуске WndProc проверяет глобальную переменную sEVENTSFUNC. Если эта переменная содержит имя Harbour функции, WndProc запускает ее на исполнение с параметрами HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam; если нет - выполняется обработчик по умолчанию - функция Events. Если Events или ваша функция-обработчик в качестве результата вернут 0, WndProc вызовет обработчик по умолчанию для Windows -DefWindowProc (что бы программа не зависла - выполнялись какие-то елементарные стандартные действия.) Поэтому думайте, что возвращать. Команда SET EVENTS FUNCTION TO MYEVENTS как раз помещает имя функции MYEVENTS в глобальную переменную и больше ничего.

Петр: Andrey пишет: А то не хочу (неудобно) делать приёмку MAIN окном. Это что прикол такой?

Andrey: Петр пишет: Это что прикол такой? Да не прикол. Хочу в другом окне WINDOWTYPE STANDARD принимать/обрабатывать WM_COPYDATA из терминалки. Из-за этого и спрашиваю, возможно ли обрабатывать событие из терминалки по этому окну ? Если нельзя, то нельзя. Будет тогда обрабатывать MAIN окно.

Петр: Andrey пишет: Хочу в другом окне WINDOWTYPE STANDARD принимать/обрабатывать WM_COPYDATA из терминалки. WM_COPYDATA передает данные от одного приложения к другому, тип окон при этом значения не имеет. В догонку: при этом принимающее окно не обязательно дожно быть видимым (Hide). Вы можете обрабатывать эти сообщения в MYEVENTS, но тем не менее SET EVENTS FUNCTION TO MYEVENTS делает то, что делает.

Andrey: Петр пишет: WM_COPYDATA передает данные от одного приложения к другому Чуток не понятно.... hWnd := FindWindow( cAppTitleServer ) Мы же передаём не приложению, а по хендлу окна // Transfer data to window "Server" SendMessageData( hwnd, cVal, nID ) т.е. я могу отправлять сообщение не приложению, а по хендлу любому окну приложения. Правильно или нет ?

SergKis: Andrey пишет Хочу в другом окне Так делай, обработчик в твоих руках, команды\ф-ии минигуи ты знаешь. Так, к примеру If _IsWindowDefined('Form_10') Form_10.Buf.Cargo := <данные wm_copydata> Postmessage(Form_10.Handle, WM_KEYDOWN, VK_F20, 0) EnfIf на окне у тебя @ 0,0 LABEL Buf ... This.Buf.Cargo := '' _DefineHotKey ( ThisWindow.Name, 0 , VK_F20 , {|| MyCopyData()} ) и Func MyCopyData() If ! empty(This.Buf.Cargo) ... прием This.Buf.Cargo := '' EndIf Return Nil или что то др. придумай

Петр: Еще раз уточните про неудобно обрабатывать в главном окне. Мне этот момент не понятен. Andrey пишет: т.е. я могу отправлять сообщение не приложению, а по хендлу любому окну приложения. Правильно или нет ? Вы отправляете сообщение окну другого приложения, любому окну другого приложения, которое захочет с вами общаться. Использовать WM_COPYDATA для передачи данных между окнами одного сообщения потерпит неудачу, система сочтет такое поведение странным и просто ничего не будет посылать. hWnd := FindWindow( cAppTitleServer ) - вместо cAppTitleServer - можете ставить, что угодно, лишь бы нашли.

Andrey: Петр пишет: Еще раз уточните про неудобно обрабатывать в главном окне. Мне этот момент не понятен. У меня отдельное окно для отображения кол-ва отправленных записей на сервер ЛетоДБ по таймеру и это же окно занимается отправкой записей на сервер. Зачем мне делать обработку события в MAIN окне, если логичней делать это в окне отправки. SergKis пишет: Так делай, обработчик в твоих руках, команды\ф-ии минигуи ты знаешь. Понял. Спасибо ! Спасибо всем за разъяснения.

Andrey: Ещё вопрос возник. А зачем нужен 3-параметр при передачи ? // Transfer data to window "Server" SendMessageData( hwnd, cVal, nID ) Я так понял что для проверки получения: IF nDataID == APP_ID // it's our data? А какие варианты кроме 777 можно использовать ? #define APP_ID 777

Петр: Вы, что пытаетесь у всех распросить, что вы там в примере написали? Andrey пишет: Я так понял что для проверки получения: Для идентификации принятых данных: если у вас на компе нет больше установленных программ или вы тщательно отследили их поведение: можете игнорировать (как вы и делали сначала). Кроме 777 - любое число от 0 до 4294967295.

Петр: Andrey пишет: Зачем мне делать обработку события в MAIN окне, если логичней делать это в окне отправки. Еще раз - обработку события вы делаете в функции обработчике, не зависимо от того, как вы представляете работу minigui. Из функции обработчика вам доступно управление видом всех окон вашей программы. Так, что поменять какой-нибудь label вы можете сразу во всех окнах. Главное. что бы вы не перехватывали ненужных вам событий. И если ID не 777 ( или любое другое число от 0 до 4294967295) не забирайте чужих данных, наоборот если это ваши данные возвратите 1, Windows поймет, что доставка состоялась. Кстати, надеюсь вы заметили, что клиент и сервер должны знать ID друг друга. И еще не факт, что чужими данными ваша программа не подавиться, неправильно их интерпретировав и обработав.

Andrey: Спасибо за разъяснения. Порой мои вопросы бывают и тупыми, но хочется понять как и что работает.

Andrey: Можно ли программе запущенной на сервере передать данные с клиентской программы напрямую ? Т.е. без всяких файлов и т.д. - как уже сделали вместе в предыдущем случае !

PSP: Andrey пишет: Можно ли программе запущенной на сервере передать данные с клиентской программы напрямую ? Т.е. без всяких файлов и т.д. - как уже сделали вместе в предыдущем случае ! Они на разных компьютерах?

Dima: Andrey HbNetIO пробовал ? PS А вообще не совсем понятна задача...

Andrey: Dima пишет: А вообще не совсем понятна задача... Входящие и Исходящие документы. Задача информер на клиенте, показывает по таймеру кол-во просроченных/не выполненных/выполненных документов (записей) или при запросе список этих записей. На сервере стоит задача сервер (просчитывает по оператору его записи), при запросе клиентом предает ему общее кол-во или список записей для этого оператора. P.S. Нашёл - MiniGUI\SAMPLES\Advanced\NETIO_2. То что надо !



полная версия страницы