2009-05-28 15 views

Odpowiedz

18

Istnieje 2 różne pomysły tutaj:
- Delphi jest uruchomiony i działa
- Aplikacja działa pod debugger

Wspólna sposobem sprawdzenia czy Delphi pracuje jest sprawdzenie obecność znanych okien IDE, które mają określoną nazwę klasy, taką jak TAppBuilder lub TPropertyInspector.
Te 2 prace we wszystkich wersjach Delphi IIRC.

Jeśli chcesz wiedzieć, czy aplikacja jest uruchomiona pod debugera, tj uruchomiony normalnie z IDE z „Uruchom” (F9) lub dołączony do debugera gdy już działa, po prostu trzeba przetestować DebugHook globalny zmienna.
Należy zauważyć, że "Odłącz od programu" nie usuwa wartości DebugHook, ale "Dołącz do procesu" ustawia ją.

function IsDelphiRunning: Boolean; 
begin 
    Result := (FindWindow('TAppBuilder', nil) > 0) and 
    (FindWindow('TPropertyInspector', 'Object Inspector') > 0); 
end; 

function IsOrWasUnderDebugger: Boolean; 
begin 
    Result := DebugHook <> 0; 
end; 

Jeśli celem jest ograniczyć korzystanie z próbnej wersji swojego komponentu, gdy aplikacja jest rozwijany, mają zarówno wady:
- Ukryte okna z właściwego className/tytuł może być włączone do aplikacji
- DebugHook można ustawić ręcznie w kodzie

+0

+ 1, ale co zrobić incase z '- DebugHook można ręcznie ustawić w kodzie' w skrócie zarówno wad, wszelkie obejście? – PresleyDias

+1

@PresleyDias, następnie zaczniesz grać w kota i myszkę ... Należy jednak pamiętać, że ręczne ustawienie DebugHook może spowodować awarię aplikacji, jeśli aplikacja napotka 'DebugBreak' lub' asm int 3 end' i nie będzie prawdziwego debuggera ... –

+0

oh ok: P ... ok, jeśli to rozwiąże aplikację, to ok – PresleyDias

1

To jest fragment kodu z www.delphitricks.com/source-code/misc/check_if_delphi_is_running.html.

function WindowExists(AppWindowName, AppClassName: string): Boolean; 
var 
    hwd: LongWord; 
begin 
    hwd := 0; 
    hwd := FindWindow(PChar(AppWindowName), PChar(AppClassName)); 
    Result := False; 
    if not (Hwd = 0) then {window was found if not nil} 
    Result := True; 
end; 

function DelphiLoaded: Boolean; 
begin 
    DelphiLoaded := False; 
    if WindowExists('TPropertyInspector', 'Object Inspector') then 
    if WindowExists('TMenuBuilder', 'Menu Designer') then 
     if WindowExists('TAppBuilder', '(AnyName)') then 
     if WindowExists('TApplication', 'Delphi') then 
      if WindowExists('TAlignPalette', 'Align') then 
      DelphiLoaded := True; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if DelphiLoaded then 
    begin 
    ShowMessage('Delphi is running'); 
    end; 
end; 


function DelphiIsRunning: Boolean; 
begin 
    Result := DebugHook <> 0; 
end; 
+2

Skopiuj i wklej horror. Ten fragment kodu powinien zostać wyczyszczony lub zapomniany. Naprawdę. –

3

Możesz użyć DebugHook <> 0 ze swojego kodu komponentu. DebugHook jest zmienną globalną (IIRC, znajduje się w jednostce Systems) ustawioną przez IDE Delphi/RAD Studio i nie można jej ustawić nigdzie indziej.

Istnieją inne techniki (FindWindow() dla TAppBuilder, na przykład), ale DebugHook bierze całą pracę z tego.

+0

DebugHook zgłasza prawdę tylko wtedy, gdy wciśnięty jest klawisz F9 wewnątrz IDE. Nie raportuje wartości true, jeśli naciśnięty został klawisz Ctrl + Shift + F9 w IDE. –

+1

@ MichaelRiley-AKAGunny: Oczywiście, że to prawda. Ctrl + Shift + F9 to ** Uruchom bez debugowania **, co całkiem nie spowoduje ustawienia DebugHook. Ale jeśli nie masz pod kontrolą debuggera, nie działasz w IDE, prawda? –

Powiązane problemy