|
Передача данных из одной программы в другую, Программирование в Borland Bilder6 |
|
|
|
 |
Ответов
(1 - 7)
|
Nov 7 2008, 07:29
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(kolisnichenko_r @ Nov 6 2008, 15:02)  Здравствуйте! Как можно передать данные из одной программы в другую? Есть одна программа, на ней поле EDIT, вводим данные. Есть другая программа, тоже поле EDIT, выводит данные, которые были введены в поле EDIT первой программы. одскажите с чего начать? Может есть где пример? Если данных немного (до 64 Кбайт), проще всего организовать обмен данными между процессами с помощью сообщений (SendMessage, PostMessage и т. п.), и в теле сообщения передавать сами данные, а в цикле обработки сообщений (DispatchMessage) извлекать их и делать, что необходимо - например, выводить в окно. В вашем случае, если нужно просто вывести строку в окно другого процесса, можно предложить ещё более простой путь. 1) Сначала в первой программе Вам нужно разыскать нужное окно EDIT из второй программы в иерархии всех окон системы, по какому-либо признаку, например, по заголовку окна (см. функцию FindWindow), таким образом, будет получен хэндл нужного окна вывода второй программы. Пусть Вас не смущает, что это окно принадлежит другой программе - хэндл окна является уникальным идентификатором окна в рамках системы. 2) Получив хэндл, можете делать с этим окном всё, что угодно - выводить в него текст (SetWindowText), перемещать его (MoveWindow) и т. п. Только обратите внимание на следующий момент - искать нужно не основное окно второго приложения, а непосредственно поле EDIT (которое тоже является окном) - все элементы графического интерфейса являются дочерними окнами относительно главного окна приложения.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Nov 7 2008, 11:05
|
Местный
  
Группа: Свой
Сообщений: 240
Регистрация: 29-01-08
Из: эМ-ск
Пользователь №: 34 553

|
для поиска дочерних окон нужно использовать FindWindowEx Код HWND FindWindowEx( HWND hwndParent, // handle to parent window HWND hwndChildAfter, // handle to a child window LPCTSTR lpszClass, // pointer to class name LPCTSTR lpszWindow // pointer to window name ); но такой подход не совсем правильный для передачи данных из программы в программу раньше для этого использовали DDE, но сейчас этот подход устарел поэтому либо как описано выше, либо через бефур обмена. Вроде есть еще другие способы, но я давно не программил, на вскидку сказать не могу
--------------------
Продаю котят. Недорого. 50р ведро.
|
|
|
|
|
Nov 7 2008, 11:28
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Задача-то какая? Написать _две_ программы? Или одну, ту что будет управлять любой уже имеющейся? В первом случае надо организовать обмен WM_* сообщениями, а во втором только через окна. CODE HWND hWnd = FindWindow("#32770", "Advanced Status"); // Ищем главное окно if(hWnd != NULL) { HWND hChild = GetWindow(hWnd, GW_CHILD); // Компонент if(hChild) { hChild = GetWindow(hChild, GW_HWNDNEXT); // Еще.. if(hChild) { hChild = GetWindow(hChild, GW_HWNDNEXT); // И еще... if(hChild) { char str[255]; GetWindowText(hChild, str, 255); // Считали из него текст (уровень сигнала WiFi) //...
|
|
|
|
|
Nov 7 2008, 12:56
|
Местный
  
Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482

|
Цитата(SysRq @ Nov 7 2008, 15:28)  Задача-то какая? Написать _две_ программы? Или одну, ту что будет управлять любой уже имеющейся? Нужно писать две программы. Делаю так: Код char buff[100]; HWND hWnd=FindWindow(NULL,"Для чтения");// if (hWnd) {GetClassName(hWnd,buff,100); ShowMessage(buff); } else{;} if(HWND hWnd_edit=FindWindowEx(hWnd,NULL,"TEdit",NULL)) {ShowMessage("All OK");// GetClassName(hWnd_edit,buff,100); ShowMessage(buff); // SetWindowText(hWnd,"ONO");// Работает char str[255]; GetWindowText(hWnd_edit, str, 255); ShowMessage(str); Edit1->Text = str; } else {ShowMessage("Error !");// } Получается все работает за исключением двух строчек: Код ShowMessage(str); Edit1->Text = str; Тоесть, извещение приходит но пустое и в Edit1 того текста который написан в другой программе тоже нету.
|
|
|
|
|
Nov 13 2008, 12:36
|
Местный
  
Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482

|
Цитата(Олег Хохлов @ Nov 12 2008, 22:51)  Если обе программы - свои, удобнее всего (из моего опыта) обмен между ними организовать с помощью объектов MailSlot
// Открываем MailSlot MailSlotHandle = CreateMailslot("\\\\.\\mailslot\\MyProgramMailSlot", sizeof(Str), 0, NULL);
дальше с ними как с файлами - ReadFile, WriteFile. программа-сервер читает из мэйл-слота периодически и если там что-то есть - обрабатывает программа-клиент пишет в мэйл-слот запрос подробнее все написано в хелпе по Win32 API... Можно куски программного кода для двух программ: передача, прием? Буду очень признателен.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|