Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача данных из одной программы в другую
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
kolisnichenko_r
Здравствуйте!
Как можно передать данные из одной программы в другую?
Есть одна программа, на ней поле EDIT, вводим данные. Есть другая программа, тоже поле EDIT, выводит данные, которые были введены в поле EDIT первой программы. одскажите с чего начать? Может есть где пример?
Demeny
Цитата(kolisnichenko_r @ Nov 6 2008, 15:02) *
Здравствуйте!
Как можно передать данные из одной программы в другую?
Есть одна программа, на ней поле EDIT, вводим данные. Есть другая программа, тоже поле EDIT, выводит данные, которые были введены в поле EDIT первой программы. одскажите с чего начать? Может есть где пример?

Если данных немного (до 64 Кбайт), проще всего организовать обмен данными между процессами с помощью сообщений (SendMessage, PostMessage и т. п.), и в теле сообщения передавать сами данные, а в цикле обработки сообщений (DispatchMessage) извлекать их и делать, что необходимо - например, выводить в окно.
В вашем случае, если нужно просто вывести строку в окно другого процесса, можно предложить ещё более простой путь.
1) Сначала в первой программе Вам нужно разыскать нужное окно EDIT из второй программы в иерархии всех окон системы, по какому-либо признаку, например, по заголовку окна (см. функцию FindWindow), таким образом, будет получен хэндл нужного окна вывода второй программы. Пусть Вас не смущает, что это окно принадлежит другой программе - хэндл окна является уникальным идентификатором окна в рамках системы.
2) Получив хэндл, можете делать с этим окном всё, что угодно - выводить в него текст (SetWindowText), перемещать его (MoveWindow) и т. п.
Только обратите внимание на следующий момент - искать нужно не основное окно второго приложения, а непосредственно поле EDIT (которое тоже является окном) - все элементы графического интерфейса являются дочерними окнами относительно главного окна приложения.
kolisnichenko_r
А FindWindow находит pодительское окно веpхнего уpовня, не осуществляет поиск дочеpних окон. Как можно найти поле EDIT?
Может есть пример?
Voice2001
для поиска дочерних окон нужно использовать 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, но сейчас этот подход устарел
поэтому либо как описано выше, либо через бефур обмена. Вроде есть еще другие способы, но я давно не программил, на вскидку сказать не могу
SysRq
Задача-то какая? Написать _две_ программы? Или одну, ту что будет управлять любой уже имеющейся?

В первом случае надо организовать обмен 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)
//...
kolisnichenko_r
Цитата(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 того текста который написан в другой программе тоже нету.
OlegH
Если обе программы - свои, удобнее всего (из моего опыта) обмен между ними организовать с помощью объектов MailSlot

// Открываем MailSlot
MailSlotHandle = CreateMailslot("\\\\.\\mailslot\\MyProgramMailSlot", sizeof(Str), 0, NULL);

дальше с ними как с файлами - ReadFile, WriteFile.
программа-сервер читает из мэйл-слота периодически и если там что-то есть - обрабатывает
программа-клиент пишет в мэйл-слот запрос
подробнее все написано в хелпе по Win32 API...
kolisnichenko_r
Цитата(Олег Хохлов @ Nov 12 2008, 22:51) *
Если обе программы - свои, удобнее всего (из моего опыта) обмен между ними организовать с помощью объектов MailSlot

// Открываем MailSlot
MailSlotHandle = CreateMailslot("\\\\.\\mailslot\\MyProgramMailSlot", sizeof(Str), 0, NULL);

дальше с ними как с файлами - ReadFile, WriteFile.
программа-сервер читает из мэйл-слота периодически и если там что-то есть - обрабатывает
программа-клиент пишет в мэйл-слот запрос
подробнее все написано в хелпе по Win32 API...

Можно куски программного кода для двух программ: передача, прием? Буду очень признателен.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.