Delphi7. Jaki jest najlepszy sposób, by nie dopuścić do uruchomienia po raz drugi programu?

0

Witam

Jaki jest najlepszy sposób, by nie dopuścić do uruchomienia po raz drugi programu, w trakcie, gdy ów program już jest włączony? Mówimy tutaj o programie pisanym w Delphi 7.

0

http://blackhorus.bizhat.com/articles/MultipleIns.htm

Na ile się w tym znam to Mutex, metoda trzecia, jest najlepsza. Jak się to dobrze zrobi to wygodniej niż to obchodzić jest odpalić drugą instancję w virtualce.

0

Przeanalizuj sobie dołączony do tego posta kod. W sumie tak jak podali poprzednicy. Najprostszą metodą jest chyba Mutex, jednak mój kod dodatkowo wysyła jeszcze do programu komunikat podający parametr wywołania exeka kolejny raz. To po to aby zobrazować jak otwierać można kolejne pliki kiedy uruchomimi juz uruchomiony program. Jednak do samej kontroli uruchomienia i przywrócenia okna programu wystarczy stworzenie mutexa, sprawdzenie GetLastError (zobacz do kodu projektu w pliku *.dpr), a następnie wysłanie zarejestrowanego w OnCreate głownej formatki komunikatu i jego obsłużenie w funkcji NewWindowProc, która przywraca okno programu i tyle.

EDIT: TomRiddle znowu to robisz, piszesz coś nie przemyślanego i później usuwasz. Skoro już napisaleś pod moim postem niemal to samo co robi mój kod, a kAzek zwrócił uwagę na to że nie pomyślałeś i zastosowałeś obsługę komunikatu, który wcale nie wysyłasz do swojej aplikacji to trzeba było to zostawić i pozwolić mi napisac również komentarz, że mój kod jest podobny oraz że zapomniałeś o SendMessage z HWND_BROADCAST, a można to robić w pliku projektu. Po to umieściłem kod aby było krócej i łatwiej. Mogłeś go ściągnąc, przenalizować i dopiero pisać.

0

a nie bylo by latwiej tak o?
Uzywalem tego kodu przy splash-screen'ie.
Moze i nie typowy ale dziala :)

Dodajemy w project.dpr (czy jak tam sie wasza aplikacja nazywa :)) )

uses
  Forms, Windows, SysUtils, Dialogs;

var
  Map : THandle;

{$R *.RES}

begin
  Map := CreateFileMapping($FFFFFFFF, nil, PAGE_READONLY, 0, 32, 'NazwaAplikacjiMap');
  if Map = 0 then begin
    ShowMessage('Blad alokacji pamieci.');
    Halt;
  end
  else if GetLastError = ERROR_ALREADY_EXISTS then begin
    ShowMessage('Juz jedna kopia programu jest w uzyciu.');
    Halt;
  end;

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