Взаимодействие программ
под Windows и взаимодействующих между собой на уровне файлов?
2.Как создать приложение Windows c двумя одновременно взаимодействующих между собой процессами на уровне сообщений?
Нужно срочно! H-e-l-p!!!!
Если можно с кодом и примером. Please H-e-l-p!!!!
Цитата:
Как создать приложение Windows c двумя одновременно взаимодействующих между собой процессами на уровне сообщений?
Может быть речь идёт о двух приложения Windows, взаимодействующих между собой, или о двух и более потоках, порождённых одним процессом Windows? Уточните задачу...
2.Приложение одно.
Речь идет о двух процессах.
Два процессах взаимодействуют между собой, на уровне сообщений.:o
А первое никто не знает??? :( :( :(---SOS! SOS!
Цитата:
Уточняю:
2.Приложение одно.
Речь идет о двух процессах.
Два процессах взаимодействуют между собой, на уровне сообщений.
2.Приложение одно.
Речь идет о двух процессах.
Два процессах взаимодействуют между собой, на уровне сообщений.
STOP!!!
В рамках одного процесса существует одно приложение! В тоже время процесс может порождать другой процесс! Процесс помимо того, что имеет основной поток, может порождать дочерние потоки.
Взаимодействие 2-х приложений осуществляется путём посылки сообщений функцией
Код:
SendMessage(hWnd: HWND; msg: Cardinal; wParam: integer; lParam: integer): integer;
Если же требуется синхронизировать данные и код двух потоков, то используются такие объекты ядра, как критические секции, мьютексы, события, семафоры и т.д.
Вот всё решение второй задачи!
2. Видимо идет речь о программе, запускающей свою копию(одно приложение - два процесса)
Вот процедура запуска:
Код:
procedure RunCopyOfSelf(hApp:HINST);
var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
path:array [0..MAX_PATH] of char;
begin
GetModuleFileName(hApp, path, MAX_PATH); // Получаем имя своего файла
ZeroMemory(@si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
CreateProcess(path, nil, nil, nil, false,0, nil, nil, si, pi);
end;
var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
path:array [0..MAX_PATH] of char;
begin
GetModuleFileName(hApp, path, MAX_PATH); // Получаем имя своего файла
ZeroMemory(@si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
CreateProcess(path, nil, nil, nil, false,0, nil, nil, si, pi);
end;
Цитата:
2. Видимо идет речь о программе, запускающей свою копию(одно приложение - два процесса)
Управлять второй копией программы? Не бред ли? Как правило создаются программистом две программы - клиентская и серверная, которые и взаимодействуют через механизм синхронизации. Смысл программы, которая взаимодействует сама с собой?
Смысл? Обучение взаимодействию процессов.
Цитата: max_dark
1. Приложения именно досовские или имеется в виду консольные под Win?
Крнечно же консольные под Windows!!!:)
Кто нибудь помогите с этим:
1.Как создать два приложения MS DOS одновременно исполняющихся
под Windows(приложения консольные) и взаимодействующих между собой на уровне файлов?:confused: :confused:
Первая программа пишет данные в файл(ну для примера)
Код:
{Файл Project1.dpr}
program Project1;
uses
Windows,
shared in 'shared.pas';
var
s:String;
f:TextFile;
begin
repeat
Write('Enter command: '); ReadLn(s); // Вводим данные
if s = '' then s:='exit';
AssignFile(f, fname);
// Записываем в файл
if GetFileAttributes(PAnsiChar(fname)) <> $FFFFFFFF then
Append(f)
else
ReWrite(f);
WriteLn(f, s);
CloseFile(f);
until (s = 'exit');
end.
{Файл shared.pas}
unit shared;
interface
const
fname = 'hello.txt';
implementation
end.
program Project1;
uses
Windows,
shared in 'shared.pas';
var
s:String;
f:TextFile;
begin
repeat
Write('Enter command: '); ReadLn(s); // Вводим данные
if s = '' then s:='exit';
AssignFile(f, fname);
// Записываем в файл
if GetFileAttributes(PAnsiChar(fname)) <> $FFFFFFFF then
Append(f)
else
ReWrite(f);
WriteLn(f, s);
CloseFile(f);
until (s = 'exit');
end.
{Файл shared.pas}
unit shared;
interface
const
fname = 'hello.txt';
implementation
end.
Вторая программа проверяет файл на изменения(допустим по времени последнего обращения к файлу), если он изменился то считываем его
Код:
{Файл Project2.dpr}
program Project2;
{$APPTYPE CONSOLE}
uses
Windows,
shared in 'shared.pas';
var
old : _FILETIME;
att : WIN32_FILE_ATTRIBUTE_DATA;
s:string;
f:TextFile;
begin
if GetFileAttributesEx(PAnsiChar(fname),GetFileExInfoStandard,@att) = FALSE then begin
exit;
end;
old:=att.ftLastWriteTime;
repeat
Sleep(200);
GetFileAttributesEx(PAnsiChar(fname),GetFileExInfoStandard,@att);
if ((old.dwLowDateTime <> att.ftLastWriteTime.dwLowDateTime) or
(old.dwHighDateTime <> att.ftLastWriteTime.dwHighDateTime))then begin
AssignFile(f, fname);
Reset(f);
WriteLn('+----------------------------------------+');
while not eof(f) do begin
ReadLn(f,s); WriteLn(s);
end;
CloseFile(f);
old:=att.ftLastWriteTime;
end;
until s = 'exit';
end.
program Project2;
{$APPTYPE CONSOLE}
uses
Windows,
shared in 'shared.pas';
var
old : _FILETIME;
att : WIN32_FILE_ATTRIBUTE_DATA;
s:string;
f:TextFile;
begin
if GetFileAttributesEx(PAnsiChar(fname),GetFileExInfoStandard,@att) = FALSE then begin
exit;
end;
old:=att.ftLastWriteTime;
repeat
Sleep(200);
GetFileAttributesEx(PAnsiChar(fname),GetFileExInfoStandard,@att);
if ((old.dwLowDateTime <> att.ftLastWriteTime.dwLowDateTime) or
(old.dwHighDateTime <> att.ftLastWriteTime.dwHighDateTime))then begin
AssignFile(f, fname);
Reset(f);
WriteLn('+----------------------------------------+');
while not eof(f) do begin
ReadLn(f,s); WriteLn(s);
end;
CloseFile(f);
old:=att.ftLastWriteTime;
end;
until s = 'exit';
end.
Особые благодарности max_dark:D :)