Słyszałem, że niektórzy autorzy komponentów niestandardowych używają procedury RTL, która sprawdza, czy Delphi działa, aby skonfigurować ograniczenia shareware. Czy ktoś wie, co to za rutyna? Sprawdzanie oczywistych nazw, takich jak "DelphiRunning" lub "IsDelphiRunning", nie przynosi niczego użytecznego.W jaki sposób mój program może powiedzieć, czy działa Delphi?
Odpowiedz
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
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;
Skopiuj i wklej horror. Ten fragment kodu powinien zostać wyczyszczony lub zapomniany. Naprawdę. –
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.
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. –
@ 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? –
- 1. W jaki sposób mój program może ustalić, czy działa on w 32-bitowym lub 64-bitowym systemie Windows?
- 2. W jaki sposób mój kod może znaleźć, czy działa w IIS?
- 3. Czy mój program Turing-complete?
- 4. Czy ktoś może wyjaśnić, w jaki sposób działa Meteor.defer()?
- 5. Czy mój program Visual C++ może odsłuchiwać własne wyniki debugowania?
- 6. Czy ktoś może mi powiedzieć, jaki to jest język?
- 7. W jaki sposób program może usunąć własny plik wykonywalny?
- 8. Czy istnieje sposób, aby mój program delphi czekał na skopiowanie dużej liczby plików?
- 9. Jak mogę powiedzieć, że mój kod działa w trybie Mono?
- 10. Dlaczego mój program działa tak wolno?
- 11. W jaki sposób aplikacja konsoli systemu C# może powiedzieć, czy jest uruchamiana interaktywnie?
- 12. W jaki sposób powiedzieć PHPStorm debugger, że mój projekt ma root dokumentu inny niż root projektu
- 13. Jak powiedzieć powiedzieć javadoc, że mój okres nie kończy zdanie
- 14. Mój pierwszy program python: czy możesz mi powiedzieć, co robię źle?
- 15. W jaki sposób mój demon Linux może wiedzieć, kiedy program Windows przestał pisać plik, do którego uzyskuję dostęp przez SAMBA?
- 16. W jaki sposób mój kod może stwierdzić, czy działa on na serwerze Google lub na lokalnym serwerze programistycznym?
- 17. Jak można oczyścić program Delphi?
- 18. W jaki sposób mój kod Objective-C iPhone'a może otrzymywać powiadomienia o błędach JavaScript w UIWebView?
- 19. w jaki sposób programować program NSMenu?
- 20. W jaki sposób klient RabbitMQ może powiedzieć, kiedy traci połączenie z serwerem?
- 21. Dlaczego program windowClosed nie jest wywoływany, czy ktoś może mi powiedzieć coś więcej na ten temat?
- 22. Czy obiekt może się sam usunąć? W jaki sposób?
- 23. W jaki sposób mój skrypt Perla może ustalić, czy plik Excel jest w formacie XLS czy XLSX?
- 24. W jaki sposób nieinwestycyjnie zwracać `Może` obiektyw?
- 25. W jaki sposób skrypt powłoki może stwierdzić, czy działa w oknie xterm z obsługą 256 kolorów?
- 26. W jaki sposób przycisk może uzyskać ostrość?
- 27. W jaki sposób XSUB Perla może umrzeć?
- 28. Jak sprawdzić, czy mój program ma podłączone do niego dane
- 29. Jaki program może pomóc pamięci REPL pamiętać i historię wyszukiwania?
- 30. W jaki sposób program szeregujący OS odzyskuje kontrolę nad procesorem?
+ 1, ale co zrobić incase z '- DebugHook można ręcznie ustawić w kodzie' w skrócie zarówno wad, wszelkie obejście? – PresleyDias
@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 ... –
oh ok: P ... ok, jeśli to rozwiąże aplikację, to ok – PresleyDias