Przekazywanie danych pomiedzy procesami

0

Mam dość nietypowy problem, otóż skojarzyłem swoją aplikację z rozszerzeniem, aplikacja jest MDI, kazdy dokument otwierany w nowej zakładce, mnie natomias interesuje rozwiązanie problemu przekazywania wartości, dokładnie to nazwa otwieranego dokumentu, pomiędzy dwoma oddzielnymi uruchomieniami mojej aplikacji, za pomocą funcki "CreateFileMapping", sprawdzam czy programik jest juz uruchomiony, jesli nie to tworzone jest nowe okienko MDI i otwierany jest dokument, natomias jezeli aplikacja jest juz w pamieci, zamykane jest to nowe jej uruchomienie, w tym miejscu chcialbym takze zrobic cos takiego zeby nazwa dokumentu, ktory chcemy otworzyc byla przekazana do pierwszego uruchomienia programu, by ten mogl go otworzyc, zbytnio nie wiem jak sie za to wziąc, byłbym wdzieczny za jakąkolwiek pomoc...

0

Zamieszałeś, ale mam wrażenie, że chodzi ci o to (post Matroxa) :
http://4programmers.net/Forum/viewtopic.php?id=44712&post=98231#98231

0

Nie oto mi chodzilo...uruchamiam dwa razy ten sam program, jak przekazac jakas wartosc z pierwszego do drugiego ?

0

Oj, zapisz ją w pliku, a potem odczytaj.

0

Myslalem o przekazaniu pointera poprzez wyslanie komunikatu, ale taka metoda sprawdza sie jedynie w tej samej aplikacji, albo nie umiem tego wykorzystac. Dla ciekawskich zrobilem cos takiego:

procedure TForm1.msg(var msg: TMessage);
var
  p: Pointer;
begin
  GetMem(p, sizeOf(QString));
  p := Pointer(msg.WParam);
  Caption := QString(p^);
end;

Czyli odbieranie pointera i wyswietlenie go na formie. (QString jest stalym stringiem o dlugosci 20 - myslalem, ze nie dziala poprzez zmienny).

Wysylam w ten sposob:

  s := 'something';
  SendMessage(FindWindow(nil, '1'), 2000, Integer(@s), 0);

Gdzie s jest QStringiem deklarowanym w publicu.

Mozna by tez zahostowac serwer tcp i w nim sie wymieniac danymi, ale to troszke nieestetyczne, najlepiej bedzie, jak poszukasz jakiegos arta o tym, jak na jakiegos natrafie to dam znac.

0

Ja osobiscie jeszcze przed napisaniem postu znalazlem pewna informacje o moim problemie, no ale wlasnie, przydaloby sie to przetlumaczyc z polskiego na nasze :) I sorki za brak formatowania...:

"Podstawą jest zrozumienie, czym jest pamięć procesu. W przeciwieństwie do środowiska Win31, gdzie programy (procesy) mogły hasać do woli po całej pamięci komputera, w środowisku 32-bit proces jest ograniczony tylko do kawałka pamięci, przydzielonej mu przez system. To oznacza, że ta sama wartość wskaźnika w dwu różnych procesach de facto oznacza różne obszary pamięci! To jest właśnie przyczyna, dla której początkujacy programiści tak często przekazuja do innego procesu jako argument wskaźnik do pamięci głównego programu i dziwią się, że program kładzie się z komunikatem Access Violation.

Najbardziej ogólnym rozwiązaniem jest polecenie systemowi, aby stworzył dla nas pewien obszar pamięci, który będzie przechowywał nasze dane. Obszar ten jest identyfikowany nazwą. Konkretny proces (główny program, DLL, procedura hooka, etc.), który chce coś zapisać lub przeczytać z takiego obszaru, otwiera obszar, tworzy widok tego obszaru i dopiero wtedy po nim pisze (czyta). Aktualizacja danych następuje po zamknięciu widoku. Zwolnienie głównego obszaru pamięci nastepuje oczywiście po wyraźnym sygnale ze strony programisty (wymagane także jest rzecz jasna wcześniejsze zamknięcie widoków).

Oto prosty przykład (bardzo prosty i bez kontroli błędow!):

// zmienne występujace zarówno w procesie 1 i 2
var
uchwyt : THandle;
wskaznik : ^tu_nazwa_Twojej_struktury;

// 1 proces, nadrzędny

// utworzenie obszaru pamięci
uchwyt:=CreateFileMapping($FFFFFFFF,nil,Page_ReadWrite,0,
rozmiar_pamieci,'naprawde unikalna nazwa');

// dowolnie hasamy z widokami na wyżej utworzony obszar
wskaznik:=MapViewOfFile(uchwyt,File_Map_All_Access,0,0,0);
// tu Twój kod operujacy na pamięci
UnmapViewOfFile(wskaznik);

// 2 proces, podrzędny

// obszar pamieci jest tworzony przez proces nadrzędny, wiec ten proces
// tylko go otwiera
uchwyt:=OpenFileMapping(File_Map_Write,TRUE,'naprawde unikalna nazwa');

// dowolnie hasamy z widokami na wyżej utworzony obszar
wskaznik:=MapViewOfFile(uchwyt,File_Map_All_Access,0,0,0);
// tu Twoj kod operujacy na pamięci
UnmapViewOfFile(wskaznik);

// kończymy te zabawę z punktu widzenia procesu 2
CloseHandle(uchwyt);

// 1 proces, nadrzędny

// kończymy tę zabawę definitywnie
CloseHandle(uchwyt);

Wiecej informacji znajdziecie w helpie do powyżej użytych funkcji.

Jeśli chcemy przekazać coś na szybko z procesu do programu głównego, który posiada okno, możemy wysłać komunikat WM_COPYDATA. Przykładowo:

var
copydata : TCopyDataStruct;
s : string;
begin
s:='przyklad wysylania komunikatu WM_COPYDATA';
copydata.cbData:=length(s);
copydata.lpData:=@s[1];
SendMessage(uchwyt_docelowego_okna,WM_COPYDATA,0,longint(@copydata));

I już naprawdę na koniec: o ile w Win31 można było przyjąć, iż program był tożsamy procesowi, tak w 32-bit jest to juz błędem. Proces jest wydzielonym kodem z własną pamięcią "operacyjną" - wyznacznikiem nie jest ani jego miejsce w naszym źrodle, ani powiązania, ani nasze pobożne życzenia. Najlepszym przykładem są funkcje hooka - funkcja ta jest transponowana do pamięci procesu adresata. Tj. jeśli napisaliśmy hooka systemowego, to system stworzy tyle jego bliźniakow, ilu może byc adresatów. Ma to swoje minusy (ból glowy programisty), ale też jest np. w miarę wygodnym mechanizmem wstrzykiwania własnej pamięci do zewnętrznych procesów (ale to już inna bajka)."

1 użytkowników online, w tym zalogowanych: 0, gości: 1