| Цитата(Romikgy @ 8.10.2008, 20:50) | имхо можно юзать filemapping , udp, pipe .... можно заюзать атомы , для твоих уелей наверное первое самое оптимальное
|
Нашёл в инете пример по работе с FileMapping:
| Код | unit Main;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type TForm1 = class(TForm) edVariable: TEdit; lbEnterValues: TLabel; bbOK: TBitBtn; bbExit: TBitBtn; lbShowValue: TLabel; lbVariable: TLabel; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure bbExitClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure bbOKClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; //глобальные переменные hFileMapObj: THandle; //описатель FaleMapping lpBaseAddress: PChar; //"указатель" (см. выше) на начальный адрес данных implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin //создадим FileMapping с именем MySharedValue //и передадим его хэндл в глобальную переменную hFileMapObj hFileMapObj := CreateFileMapping(MAXDWORD, nil, PAGE_READWRITE, 0, 4, 'MySharedValue'); if (hFileMapObj = 0) then //ошибочка вышла ShowMessage('Не могу создать FileMapping!') else //подключим FileMapping к адресному пространству //и получим начальный адрес данных lpBaseAddress := MapViewOfFile(hFileMapObj, FILE_MAP_WRITE, 0, 0, 0); if lpBaseAddress = nil then //ошибочка вышла ShowMessage('Не могу подключить FileMapping!'); end;
procedure TForm1.bbExitClick(Sender: TObject); begin //закроем форму Close; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin //кое-что надо сделать при закрытии формы: //отключим FileMapping от адресного пространства UnMapViewOfFile(lpBaseAddress); //освободим объект FileMapping CloseHandle(hFileMapObj); //теперь форму можно закрыть Action := caFree; end;
procedure TForm1.bbOKClick(Sender: TObject); begin //поместим в адресное пространство свои данные //переменная типа PChar имеет в конце завершающий #0, значит при считывании данных //система сама сможет определить, где находится конец нужных данных StrPCopy(lpBaseAddress, edVariable.Text); end;
procedure TForm1.Timer1Timer(Sender: TObject); begin //считаем нужные данные, обратившись по начальному адресу //данных адресного пространства FileMapping lbVariable.Caption := PChar(lpBaseAddress); end;
end.
|
Вопросов возникло немало: а как из другого приложения читать то, что пишет первая. Нужно ли, чтобы обе программы работали одновременно ? У меня планируется, что 2 приложения будут работать в течение долгого времени - несколько часов(в бесконечных циклах). Т.е. они оба будут работать беспрерывно. Но как всё таки читать вторым приложением то что пишет первое, не понимаю. Как получить доступ к той области, куда пишет первое.... по идентификатору какому-то(заранее оговоренному?) ? Было бы здорово получить пример . Заранее спасибо за любой ответ |