Автор | Сообщение |
|
| постоянный участник
|
Пост N: 2200
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.05.12 10:52. Заголовок: Как передать данные из одной программы в другую ?
Всем привет... Есть ли механизм передачи данных между программами ? Допустим прога на МиниГуи запустила терминалку. Как узнать что терминалка нормально запустилась ?
|
|
|
Новых ответов нет
, стр:
1
2
3
All
[см. все]
|
|
|
| постоянный участник
|
Пост N: 764
Зарегистрирован: 27.01.07
|
|
Отправлено: 05.05.12 13:22. Заголовок: Механизм mutex-ов..
Механизм mutex-ов
|
|
|
|
| постоянный участник
|
Пост N: 2201
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.05.12 13:36. Заголовок: А пример можно для Х..
А пример можно для Харбора как это будет работать ? А то по описанию трудно понять как это делать... Когда с этим работаешь, то понятно... а когда не знаешь как использовать, то труба !
|
|
|
|
| постоянный участник
|
Пост N: 2208
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.05.12 19:32. Заголовок: Нашел на Дельфи: Де..
Нашел на Дельфи: Дело в том, что можно в памяти создавать временные файлы. При перезагрузке они теряются, а так существуют. Кстати, этот метод можно использовать и для обмена информацией между вашими приложениями. Пример с использованием FileMapping: Скрытый текст
program Project1; uses Windows, // Обязательно Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} const MemFileSize = 1024; MemFileName = 'one_inst_demo_memfile'; var MemHnd : HWND; begin // Попытаемся создать файл в памяти MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, MemFileSize, MemFileName); // Если файл не существовал запускаем приложение if GetLastError<>ERROR_ALREADY_EXISTS then begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; CloseHandle(MemHnd); end.
| А как бы сделать похожее на МиниГуи ?
|
|
|
|
| |
Пост N: 21
Зарегистрирован: 24.02.11
|
|
Отправлено: 17.05.12 10:12. Заголовок: А если просто создав..
А если просто создавать временный файл на диске?
|
|
|
|
| постоянный участник
|
Пост N: 2209
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.05.12 18:03. Заголовок: vvv пишет: А если п..
vvv пишет: цитата: | А если просто создавать временный файл на диске? |
| Ну это будет слишком просто и непонятно.... Прога на МиниГуи (вывесила заставку ЗАПУСКАЮ....), далее запустила терминалку на хХарборе, терминалка на хХарборе создала временный файл "все'Ok". Далее прога на МиниГуи у себя отметила что прога на хХарборе запустилась нормально, убрала заставку ЗАПУСКА (как сделать пока не представляю)... Потом нужно рассматривать варианты, если программа не запустилась по каким то причинам... кто будет убирать заставку и когда ? И т.д.
|
|
|
|
| |
Пост N: 63
Зарегистрирован: 16.12.08
|
|
Отправлено: 17.05.12 18:21. Заголовок: Есть интересный при..
|
|
|
|
| постоянный участник
|
Пост N: 2210
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.05.12 20:15. Заголовок: santy пишет: Есть и..
santy пишет: Спасибо. Только в С я не силен. Как бы на Харборе сделать ?
|
|
|
|
| постоянный участник
|
Пост N: 30
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.05.12 21:40. Заголовок: Для Andrey
Andrey пишет: цитата: | Прога на МиниГуи (вывесила заставку ЗАПУСКАЮ....), далее запустила терминалку на хХарборе, терминалка на хХарборе создала временный файл "все'Ok". Далее прога на МиниГуи у себя отметила что прога на хХарборе запустилась нормально, убрала заставку ЗАПУСКА (как сделать пока не представляю)... Потом нужно рассматривать варианты, если программа не запустилась по каким то причинам... кто будет убирать заставку и когда ? И т.д. |
| Вот примерный ответ (не C и hb) на AutoIt3: Скрытый текст
; Запуск AutoIt3.exe <ScriptName.au3> ; В AutoIt3 есть возможность собирать из скрипта Exe, включая в него файлы, ; как при инсталяции. ; http://autoit-script.ru/ #NoTrayIcon $jpg = ".\images\darkside.jpg" ; Создать всплывающее окно с изображением. по умолчанию в центре экрана ; SplashImageOn("title", "file" [, width] [, height] [, x pos] [, y pos] [, opt]) ; file - Полный путь к файлу с изображением (BMP, GIF или JPG). SplashImageOn("Splash Screen", $jpg, 150, 150) ; Инициализировать набор пользовательских реквизитов для выполнения ; Run и RunWait операций. Только для 2000/XP и позже. ; If RunAsSet("Administrator", @Computername, "adminpassword") Then ; Run("MyProg.exe MyParam", "WorkingDir") ; снять набор пользовательских реквизитов ; RunAsSet() ; EndIf Run("MyProg.exe MyParam", "WorkingDir") ; Прервать выполнение скрипта до момента появления указанного окна. ; WinWait ( "title", ["text"], [timeout] ) ; или ; Прервать выполнение скрипта до момента активизации указанного окна. ; timeout в секундах ; WinWaitActive ( "title", ["text"], [timeout] ) If WinWaitActive( "MyProgramTitle", "", 30 ) Then MsgBox(1, "Info", "MyProgram started", 10) ; timeout 10 сек. Else MsgBox(1, "Info", "Failed started", 10) ; timeout 10 сек. ; Принудительно закрыть окно. ; WinKill ( "title", ["text"] ) ; или ; Остановить выполнение указанного процесса. ; ProcessClose ( "process" [, flag] ) ; Названия процессов могут быть, например, "notepad.exe", "winword.exe". EndIf ; Закрыть окна, открытые с помощью SplashTextOn или SplashImageOn. SplashOff()
|
|
|
|
|
| |
Пост N: 22
Зарегистрирован: 24.02.11
|
|
Отправлено: 18.05.12 10:06. Заголовок: Андрей, а какой кома..
Андрей, а какой командой запускаешь терминалку?
|
|
|
|
| постоянный участник
|
Пост N: 2211
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.05.12 12:12. Заголовок: vvv пишет: Андрей, ..
vvv пишет: цитата: | Андрей, а какой командой запускаешь терминалку? |
| ShellExecute(, 'open',cPathExe+cRunExe, cParam, "" , SW_SHOWNORMAL)
|
|
|
|
| постоянный участник
|
Пост N: 5165
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.11.16 18:07. Заголовок: Возвращаюсь опять к ..
Возвращаюсь опять к этому вопросу. Уже много времени прошло. В прошлом году для обмена между МиниГуи и терминалкой сделал (с помощью форумчан) пример: MiniGUI\SAMPLES\BASIC\COMM_2 Вроде отлично работал, пока пути без русских букв. Реализовал передачу данных всё таки через базу по таймеру. Сейчас хочу переделать. Нужно передавать данные между двумя программами (своими) на одном компе. Можно ли использовать стандартный SendMessage() ? Основная программа (сервер) на МиниГуи, клиент терминалка. В клиенте правятся записи базы, после редактирования SendMessage() и эти номера записей принимает сервер. Какова вероятность потери при передачи с SendMessage() ? И ещё при взаимодействии с другими программами (допустим на С#) сколько можно передать данных ? Т.е. какой максимальный размер данных при передачи через SendMessage() ?
|
|
|
|
|
| постоянный участник
|
Пост N: 1285
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.11.16 19:15. Заголовок: Andrey пишет Сейчас ..
Andrey пишет С терминалкой, не очень будет, с wvt можно через WM_COPYDATA Проще сделать через переменную(е) Enviroment (вроде до 4К), т.е. hb_SetEnv(..., ...) hb_GetEnv(...)
|
|
|
|
| постоянный участник
|
Пост N: 5166
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.11.16 19:47. Заголовок: SergKis пишет: С те..
SergKis пишет: цитата: | С терминалкой, не очень будет, с wvt можно через WM_COPYDATA |
| У меня терминалка с wvt. Тест с C# идёт, c терминалкой нет. P.S. Нашел вот тут нужную тему: Передача сообщений между приложениями/процессами при помощи сообщения WM_COPYDATA http://www.frolov-lib.ru/books/bsp/v27/ch2_2.htm Минигуи сделал, работает. А терминалку нет. Как в терминалке прикрутить передачу - функцию SendCopyDataMsg() ? Саму функцию взял из МиниГуи - Скрытый текст
#pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #ifndef __XHARBOUR__ #define ISBYREF( n ) HB_ISBYREF( n ) #endif HB_FUNC( SENDCOPYDATAMSG ) { HWND hwnd; COPYDATASTRUCT cds; hwnd = (HWND) hb_parnl( 1 ); cds.dwData = 0xCE98; cds.lpData = (char *) hb_parc( 2 ); cds.cbData = strlen( (char*) cds.lpData ); SendMessage( hwnd, WM_COPYDATA, 0, (LPARAM) &cds ); } #pragma ENDDUMP
|
|
|
|
|
| постоянный участник
|
Пост N: 1286
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.11.16 21:02. Заголовок: Andrey пишет Как в т..
Andrey пишет цитата: | Как в терминалке прикрутить передачу |
| 1. Надо залезть в исходники, добавить обработку WM_COPYDATA, прочитать получ. данные, сохранив в буф. и послать какой то KeyBoadrd 2. Иметь процедуру, которая сможет получить данные из буф. ( HB_FUNC ) 3. Сделать SET KEY на KeyBoard процедуры из 2., которая примет полученные данные как то так
|
|
|
|
| постоянный участник
|
Пост N: 1321
Зарегистрирован: 09.10.06
|
|
Отправлено: 10.11.16 23:13. Заголовок: Andrey пишет: Как в..
Andrey пишет: цитата: | Как в терминалке прикрутить передачу - функцию SendCopyDataMsg() ? |
| SergKis пишет: цитата: | 1. Надо залезть в исходники |
| Или я не вижу всех сообщений, или вы издеваетесь друг над другом..
|
|
|
|
| постоянный участник
|
Пост N: 1287
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.11.16 01:35. Заголовок: Петр И в чем протев..
Петр И в чем протеворечие ? Andrey про МиниГуишный вариант, я про wvt-ый (принять по WM_COPYDATA). Возможно у Вас есть решение, но это уже др. история\предложение.
|
|
|
|
| постоянный участник
|
Пост N: 1322
Зарегистрирован: 09.10.06
|
|
Отправлено: 11.11.16 16:58. Заголовок: SergKis пишет: И в ..
SergKis пишет: Нет противоречий, но.. Andrey пишет: цитата: | Как в терминалке прикрутить передачу - функцию SendCopyDataMsg() |
| похоже на тонкий троллинг публики. А с вашей стороны рекомендации по организации прийома с использованием какого-то KeyBoadrd, наводят меня на мысль, что я что-то пропустил или не понял. Процесс организации прийома описан правильно, ну чуть усложнили.. Но последний вопрос был про передачу! А рекомендации на эту тему Андрею я давал. Что-то вроде используйте то, что знаете и умеете. Стандартов нет - варианты есть, тем более если все размещено локально. И еще, если Андрей написал сервер, то обычно сервер работает по какому-то протоколу - пускай его и использует для взаимодействия. Я уже не говорю, что "времени прошло много" и с терминалки можно было спрыгнуть. Но это лень, мне знакомо это святое чувство
|
|
|
|
| постоянный участник
|
Пост N: 5167
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.11.16 17:57. Заголовок: Петр пишет: Я уже н..
Петр пишет: цитата: | Я уже не говорю, что "времени прошло много" и с терминалки можно было спрыгнуть. Но это лень, мне знакомо это святое чувство |
| Ага. С удовольствием бы спрыгнул. Третий год АКТИВНО переделываю проект. Бровсом только год занимаюсь. Без поддержки с форума не смог бы столько сделать. БОЛЬШОЕ ВАМ ВСЕМ СПАСИБО, кто помогал мне ! Конец работы уже виден, но столько ещё делать.... А юзера новую прогу и не жалуют. Перевести на новую программу одна морока. Как привыкли работать, так и всё. Юзера не любят осваивать новое. Не знаю что с ними делать... Разобрался я с Передачей сообщений между приложениями. В качестве обучающего примера выслал Григорию для включения в библиотеку. Передача строки идёт на ура ! И даже ехе-ник в 700Мб передаю и получаю !!! Всё глотает. Пробовал через C# передать строку в 50Мб - проходит, т.е. Минигуи такую строку тоже принимает. Но сборщик МУСОРА в С# хуже чем в Харборе (это не моё мнение). Теперь можно реализовать по событию контроль за изменением записей в базе между двумя программами и обходиться без таймера.
|
|
|
|
| постоянный участник
|
Пост N: 1288
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.11.16 18:45. Заголовок: Петр пишет похоже на..
Петр пишет цитата: | похоже на тонкий троллинг публики |
| Это не троллинг, что в данный момент Андрею надо, то он и говорит прямо, честно и откровенно. Правда, потом оказывается, надо еще воз и тележку и не маленькую ..., потому я сразу про wvt прием и говорил. цитата: | Процесс организации прийома описан правильно, ну чуть усложнили.. |
| В чем ? Сейчас это уже не использую (в hb 2.0 было), но интересно, если проще можно.
|
|
|
|
| постоянный участник
|
Пост N: 1323
Зарегистрирован: 09.10.06
|
|
Отправлено: 11.11.16 21:42. Заголовок: SergKis пишет: В че..
SergKis пишет: цитата: | В чем ? Сейчас это уже не использую (в hb 2.0 было), но интересно, если проще можно. |
| По пунктам цитата: | 1. Надо залезть в исходники, добавить обработку WM_COPYDATA, прочитать получ. данные, сохранив в буф. и послать какой то KeyBoadrd |
| Не обязательно. Нужно заменить стандартный обработчик окна. Это можно делать и что назывется "на лету". KeyBoard зачем трогать? цитата: | 2. Иметь процедуру, которая сможет получить данные из буф. ( HB_FUNC ) |
| Все зависит от пункта №1. Все действие можно перевести и на PRG уровень. цитата: | 3. Сделать SET KEY на KeyBoard процедуры из 2., которая примет полученные данные как то так |
| Опять же вы использовали существующий механизм, а без этого можно обойтись. На PRG уровне вы создаете публичную переменную (масив строк, хаш) и по событию WM_COPYDATA ваш обработчик добавляет в переменную элементы. Вам остается контролировать состояние переменной (используя таймер, потоки, возможности hb_idle * - то, что у вас лучше всего получается) и вовремя удалять отработанные данные. В качестве переменной может быть экземпляр какого-то класса с методами и свойствами. Я надеюсь, что Андрей организовал хоть какую-то проверку целосности данных. Если бы речь о 2-х MiniGUI программах, то там вообще "рай": мультипоточность (в разумных пределах, MiniGUI не thread safe), сериализация/десериализация переменных простых типов, выбор методов проверки контрольных сум. Я надеюсь, что пример Андрея будет именно таким
|
|
|
Новых ответов нет
, стр:
1
2
3
All
[см. все]
|
|