Problem z uruchomieniem 2 innych programów

0

var
hM : HDC;
begin
hM:=CreateFileMapping(THANDLE($FFFFFFFF),nil,
PAGE_READONLY,0,32,'ApplicationTestMap');
if GetLastError=ERROR_ALREADY_EXISTS then
begin
Application.Terminate;
CloseHandle(hM);
end;

Mam taką procedure która obsługuje pare programów w zdarzeniu ONCREATE zeby nie mozna było jednego programu otworzyc kilka razy.
I jest ok ... ale gdy odpale program i teraz chcĘ odpalic inny mój program to nie chce sie odpalic bo ten program też obsluguje tą procedure co mam zmienic zeby tak nie było wiem ze cos w tej wyzej procedurze
cos chyba w tym CreateFileMapping(THANDLE($FFFFFFFF) nie jestem pewnien co mam zmienic FFFFFFFF ??

Dzieki za odpowiedzi [browar]

0

1) Powinieneś zmienić "ApplicationTestMap" na inny text.
2) Polecam użyć tego w głównym pliku przed stworzeniem formy, a nie już w zdarzeniu OnCreate
3) Polecam bardziej elegancki sposób opisany dosadnie tu:
http://4programmers.net/Forum/viewtopic.html?id=25186

0

A można zrobić coś takiego, że blokujemy uruchomienie konkretnego programu dopiero za np. 5 razem? Innymi słowy - chciałbym ograniczyć ilosc kopii rpogramu do liczby innej niż 1 :)

0

A można zrobić coś takiego, że blokujemy uruchomienie konkretnego programu dopiero za np. 5 razem? Innymi słowy - chciałbym ograniczyć ilosc kopii rpogramu do liczby innej niż 1 :)

Można - wszystko można :-).
Ja bym to zrobił tak:

Umieszczam zmienną w programie (na początku równą zeru) i w miejscu, gdzie wysyłam komunikat WM_SHOWYOURSELF z powrotem otrzymuję wartość tej zmiennej (wykonane to zostanie poprzez funkcję obsługi tego komunikatu, która zwróci tę wartość). Teraz porównuję ją z wartością maksymalnej liczby kopii programu i jeśli jest równa, to zamykam aktualny program. Natomiast jeśli jeszcze jedna instancja programu się zmieści w ustalonym maksimum, to odpalamy program i teraz:

  • przypisujemy zmiennej liczbę zwróconą przez SendMessage i dodajemy 1
  • musimy wyszukać wszystkie uruchomione kopie naszego programu (FindWindow lub lepiej EnumWindows) i za pomocą jakiegoś zdefiniowanego naszego komunikatu przekazać im nową wartość zmiennej.

To samo należy wykonać przy zamykaniu aplikacji - wyszukać wszystkie kopie i przekazać im wartość zmiennej zmniejszonej o 1.

Myślę, że wszystko jest jasne. To tylko teoria nigdy przeze mnie nie testowana, ale powinno być wszystko OK.

0

Marooned a jaki mam tam inny tekst wpisac ??
dzieki za pomoc !

0

Marooned a jaki mam tam inny tekst wpisac ??

8-0 8-0
Czy to pytanie-pułapka? user image

W programie A piszesz na przykład:

hM:=CreateFileMapping(THANDLE($FFFFFFFF),nil,
PAGE_READONLY,0,32,'MojProgramA');

a w programie B tak:

hM:=CreateFileMapping(THANDLE($FFFFFFFF),nil,
PAGE_READONLY,0,32,'MojProgramB');
0

Dzieki Koles ... nie wiedziałem ;-)
[hurra]
[browar]

//Koleś? Naoglądałeś się pewnie The Big Lebowski ;-) - m.M

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