Mam pytanie jak można zapisać do pamięci jakiś tekst, a potem żeby drugi program (inny nie ten sam) mógł odczytać dane?.
spróbuj zapisać do schowka systemowego
Masz wiele możliwość - temat IPC (inter-process communication) jest bardzo szeroki. Przykładowe rozwiązania:
- pamięć współdzielona
- przesłanie komunikatu
- potoki nienazwane
- potoki nazwane
- gniazda
- pliki lokalne
Szukałem w necie artykółów dotyczących potoków i pamięci współdzielonych w delphi i nic nie znalazlem. ma ktos jakies linki?
uzyj nawet tego (po modyfikacji kodu)
http://4programmers.net/Delphi/FAQ/Jak_za%C5%82adowa%C4%87_nasz%C4%85_aplikacj%C4%99_do_pami%C4%99ci_innej_)
No to prosty przykład pamięci współdzielonej.
Aplikacja wysyłająca tekst: przycisk Button1 oraz pole Edit1. Kod naciśnięcia przycisku:
var h:THandle;
Addr:pchar;
begin
h:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 512, 'Test1');
if (h<>0) then
begin
Addr:=MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 512);
if (Addr<>nil) then
begin
StrCopy(Addr, PChar(Edit1.Text));
UnmapViewOfFile(Addr);
end;
Sleep(1200);
CloseHandle(h);
end;
end;
Aplikacja obserwująca pamięć: Timer1. Akcja na OnTimer:
var h:THandle;
Addr:pchar;
begin
h:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 512, 'Test1');
if (h<>0) then
begin
Addr:=MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 512);
if (Addr<>nil) then
begin
Caption:=Addr;
UnmapViewOfFile(Addr);
end;
CloseHandle(h);
end;
end;
Krótkie podsumowanie: aplikacja 1 rezerwuje pamięć współdzieloną o nazwie 'Test1' (512 bajtów), pobiera jej uchwyt, kopiuje tam tekst i zwalnia uchwyt, a następnie zasypia na 1200ms, by dać aplikacji 2 czas na odczytanie przed zwolnieniem zarezerwowania pamięci. Aplikacja 2 co 1000ms rezerwuje pamięć o takiej samej nazwie (dostając dostęp do tego samego obszaru co aplikacja 1).
Gdy aplikacja 2 zarezerwuje pamięć po tym, jak aplikacja 1 już zwolniła zarezerwowanie, dostaje pusty obszar, a więc nie będzie w nim tekstu. Dlatego aplikacja 1 zasypia, by dać czas na odczyt ciągle tej przypisanej pamięci.