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

Odpowiedz Nowy wątek
2011-08-04 02:18
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.

Pozostało 580 znaków

2011-08-04 02:24
O_o
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.


O̾..͠o
edytowany 2x, ostatnio: O_o, 2011-08-04 15:20
Dla ścisłości chodzi o metodę 3 (czwarta jest oparta o współdzieloną DLL) - kAzek 2011-08-04 07:50
do tego całe IPC - gniazda, mailsloty, semafory, potoki nazwane, eventy, komunikaty... - ŁF 2011-08-04 09:33
@O_o - da się zrobić obejście, wystarczy wyedytować w kopii programu nazwę muteksa. - ŁF 2011-08-04 09:33
@kAzek: poprawiłem. @ŁF: nigdy mi się nie chciało edytować jakoś a jedyny przypadek w którym mi się prawie mi się zachciało okazał się dziełem jakiegoś mistrza winapi i już tak prost nie było, w dodatku licenjce raczej takiego czegoś nie lubią. ;) - O_o 2011-08-04 15:21

Pozostało 580 znaków

2011-08-04 20:11
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ć.


edytowany 1x, ostatnio: olesio, 2011-08-04 21:40
Pokaż pozostałe 2 komentarze
Dziekuję kAzek, że bronisz mojego kodu :) Fakt, dla pewności lepiej wysłać jakąś unikalną liczbę w DataStruct.dwData i sprawdzać ją w kodzie obsługi komunikatu WM_COPYDATA. Jednak pytanie było o uniemożliwienie uruchomienia programu po raz kolejny, a ja zaznaczyłem w treści, że wysyłanie WM_COPYDATA jest tylko dodatkiem, którego już ze źródła nie wycinałem, uprzedzając możliwe ewentualnie pytania w stylu: "a co jak jest otwarty program i chce otworzyć okienko z nowym plikiem? a nie wiem co to DDE albo mi ono nie działa". - olesio 2011-08-06 19:25
kAzek, ja nie zwróciłem uwagi na komunikat SendMessage(HWND_BROADCAST, RegisterWindowMessage(Msg_Name), 0, 0) (tu jest OK), tylko na ten drugi SendMessage(HWND_BROADCAST, WM_COPYDATA, 0, Integer(@DataStruct)). Proszę czytać ze zrozumieniem. - marogo 2011-08-07 11:59
pod Win 7 nie dziala to stabilnie, fakt odpala sie wszystko fajnie i gdy zamkne to usuwa sie rowniez z procesow, A gdy jedna kopia programu jest odpalona i odpale program po raz kolejny, system cos mysli ale nie otwiera drugiej kopii programu. Program zamykam a patrze w procesach sa az 2 kopie uruchomione. Wiec im wiecej razy bede chcial odpalic program tym wiecej procesow na liscie odpalonych bedzie no ale nic nie widac + przy zamknieciu sie.. nie zamykaja sie i trzeba zabijac wszystko recznie. - djkolo 2011-08-08 05:10
@djkolo: sam używam Windows 7 i nie stwierdziłem aby mi zostawały jakiekolwiek procesy po sprawdzaniu mutexem tak jak jest w kodzie, który dołaczyłem. - olesio 2011-08-08 06:11
tak przepraszam za blad, dzis sprawdzilem to jeszcze raz i juz jest ok - djkolo 2011-08-08 15:35

Pozostało 580 znaków

2011-08-08 04:58
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;
 


edytowany 3x, ostatnio: djkolo, 2011-08-08 05:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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