Ассемблер для Windows



         

В Возможны ли какиелибо способы взаимодействия и обмен информацией между запущенными приложениями?



В. Возможны ли какие-либо способы взаимодействия и обмен информацией между запущенными приложениями?

Мы уже говорили о различных способах синхронизации, о разделяемой памяти. Есть еще один интересный подход, реализованный в Windows, - это анонимные каналы (pipes)46. Этот подход наиболее эффективен для обмена информацией с консольным процессом, порождаемым данным процессом. Представьте себе, что Вам необходимо, чтобы запускаемый Вами из приложения консольный процесс (например, какой-нибудь строковый компилятор) выводил информацию не в консоль, а в окно редактирования основного процесса. Пример такого приложения представлен на Рисунок 3.5.3.

Идея использования каналов очень проста. Канал - как труба: с одной стороны в него втекает информация, а с другой вытекает. Создавая процесс, можно передать ему в качестве дескриптора ввода или вывода соответствующий дескриптор канала. После этого можно обмениваться информацией между двумя процессами при помощи уже известных Вам функций WriteFile и ReadFile.

// файл pipe.rc // определение констант #define WS_SYSMENU 0x00080000L #define WS_VISIBLE 0x10000000L #define WS_TABSTOP 0x00010000L #define DS_3DLOOK 0x0004L #define ES_LEFT 0x0000L #define WS_CHILD 0x40000000L #define WS_BORDER 0x00800000L #define ES_MULTILINE 0x0004L #define WS_VSCROLL 0x00200000L #define WS_HSCROLL 0x00100000L

MENUP MENU { POPUP "&Запуск программы" { MENUITEM "&Запустить", 200 MENUITEM "Выход из &программы", 300 } }

// определение диалогового окна DIAL1 DIALOG 0, 0, 200, 140 STYLE WS_SYSMENU | DS_3DLOOK CAPTION "Пример использования PIPE" FONT 8, "Arial" { CONTROL "", 101, "edit", ES_LEFT | ES_MULTILINE | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL, 24, 20, 128, 70 }

; файл pipe.inc ; константы

SW_HIDE equ 0 SW_SHOWNORMAL equ 1 STARTF_USESHOWWINDOW equ 1h STARTF_USESTDHANDLES equ 100h STARTF_ADD = STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES

; сообщение приходит при закрытии окна WM_CLOSE equ 10h WM_INITDIALOG equ 110h WM_COMMAND equ 111h EM_REPLACESEL equ 0C2h




Содержание  Назад  Вперед