![]() |
Delphi suchen...
Hi DPler,
wie kann ich aus einer Anwendung heraus feststellen, ob Delphi zur Zeit akitv ist. Dabei ist zu beachten, daß die Anwendung nicht unter Delphi läuft. Es muß für alle Delphi-Version aber Delphi 4 funktionieren. ...:cat:... |
Moin sakura,
eine spontane Idee: In der Registry steht unter HKLM\Software\Borland\Delphi\<VERSION, z.B. 5.0> ein Wert App, der den Pfad zur Delphi32.EXE enthält. Du könntest überprüfen, ob diese Datei aktiv ist oder nicht. (bei mehreren Installierten Versionen natürlich bei jeder zu prüfen ;-) ) |
Zitat:
...:cat:... |
mhm mir würde jetzt mal einfallen, nach dem Fenster zu suchen. Also das Handle zu suchen (z.B. nach dem Titel des Fensters suchen). Würde das nicht das Problem lösen?
|
Moin sakura,
das ginge dann entweder elegant über die Prozessliste, oder brutal, indem Du einfach versuchst die Datei zum Schreiben zu öffnen. Schlägt das fehlt ist die EXE aktiv ;-) (Schliessen nicht vergessen) |
Zitat:
Zitat:
...:cat:... |
Hat es schon einer mit
FindWindow('AppBuilder', nil) probiert? Ja Delphi's eigentlicher Name sollte "App(lication) Builder" sein. Es wurde dann aber doch der Codename benutzt, da die Presse diesen schon so gut vermarket hatte. |
so ähnlich meinte ich das ja
|
Moin sakura,
was die Prozessliste angeht, hab' ich das leider auch nicht parat. Das müsste ich mir auch erst einmal wieder zusammensuchen ;-) Aber hierbei musst Du dann ja auch wieder zwischen 9xff und NTff unterscheiden. Schade, dass ich das mit dem zum Schreiben öffnen unter 9x nicht ausprobieren kann, denn auch dort müsste die Datei wenn sie läuft vom System exklusiv geöffnet worden, und somit blockiert sein. Alexanders bzw. jbg's Variante sind doch der Überlegung Wert. Das dürfte die mit Abstand einfachste Möglichkeit sein. |
Ich entscheide mich erst einmal für die einfache Variante, welche denn dann heisst:
Code:
Danke
FindWindow('[b][color=#e50000]T[/color][/b]AppBuilder', nil)
...:cat:... |
Hi,
zum Prozesse auflisten hab ich vor ein paar Wochen mal bei Swissdelphicenter was gefunden und etwas abgewandelt:
Delphi-Quellcode:
Nen Teil hab ich noch nich so recht verstanden, daher ein paar komische Kommentare.
{GetProcesses schreibt die laufenden Prozesse (Exe- Dateien) in eine
Textdatei. Gibt 0 zurück, wenn alles lief, ansonsten die entsprechende IO- Fehlernummer. Nur Shortstring und kompatibel übergeben (als Filename)} function GetProcesses(fname: shortstring): integer; var hProcSnap: THandle; pe32: TProcessEntry32; f: textfile; i: integer; Label ende; begin i:= 0; result:= i; assignfile(f, fname); { Snapshot machen *PENG* } hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnap = INVALID_HANDLE_VALUE then exit; pe32.dwSize := SizeOf(ProcessEntry32); {$I-} rewrite(f); i:= ioresult; if i <> 0 then begin result:= i; goto ende; end; {wenn das SizeofDingens geklappt hat} if Process32First(hProcSnap, pe32) = true then { und los geht's } while Process32Next(hProcSnap, pe32) = true do begin writeln(f, pe32.szExeFile); i:= ioresult; if i <> 0 then begin result:= i; goto ende; end; end; ende: CloseFile(f); {$I+} CloseHandle(hProcSnap); end; Meine Abwandlung ist dass ich die Prozesse die ich bekomme in ne Datei schreibe, die ich dann später in ne ListBox oder sonstwas laden kann. Das funktioniert übrigens unter 9x- und NT Systemen. Wenn du dich für diese Variante noch interessierst, kannstes ja mal probieren. Bis dann, S - tefano [EDIT]Achja, bitte steinigt mich nicht wegen der Labels...[/EDIT] |
Mit der Prozessliste gibts auch noch ein Stück Code aus der
![]() |
|
Falls es noch interessiert:
Unter Win98 SE sind geöffnete EXEs schon schreibgeschützt. Daß es bei Win95 und 98FE und 98ME auch so ist, davon ist auszugehen. alles andere wäre ja auch Schwachsinn (obwohl... MS zuzutrauen wär's...) |
@S - tefano.
An Process32First hatte ich auch gedacht, aber Achtung, obwohl es von Win95/98 und W2K unterstützt wird, so wird es laut MSDN nicht von NT4 unterstützt. Von daher nehme ich es lieber nicht. ...:cat:... |
Zitat:
MfG Florian :hi: P.S.: Ist klar, dass du SE meinst. :D |
nein, hätte ich SE gemeint, hätte ich's auch geschrieben ;-)
Windows 98 Millenium Edition. Verkafut wurde es zwar als Windows ME, aber trotzdem isses ein Windows 98, nur halt ein wenig aufgemotzt. |
:shock: Hier lerne ich ja noch richtig was... ;)
MfG Florian :hi: |
Oh, hab ich garnicht gesehen :? ...
naja, aber unter XP geht das auch :mrgreen: Bis dann, S - tefano |
Hallo Daniel,
ich hätte hier was um zu prüfen ob eine EXE läuft:
Delphi-Quellcode:
uses ..., TlHelp32, PsAPI;
Delphi-Quellcode:
Viel Spass damit.
procedure CreateWin9xProcessList(List: TStringList);
var hSnapShot: THandle; ProcInfo: TProcessEntry32; begin if List = nil then Exit; hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapShot <> THandle(-1)) then begin ProcInfo.dwSize := SizeOf(ProcInfo); if (Process32First(hSnapshot, ProcInfo)) then begin List.Add(ProcInfo.szExeFile); while (Process32Next(hSnapShot, ProcInfo)) do List.Add(ProcInfo.szExeFile); end; CloseHandle(hSnapShot); end; end; procedure CreateWinNTProcessList(List: TStringList); var PIDArray: Array[0..1023] of DWORD; cb: DWORD; i: integer; ProcCount: integer; hMod : HMODULE; hProcess: THandle; ModuleName: Array[0..300] of Char; begin if List = nil then Exit; EnumProcesses(@PIDArray, sizeof(PIDArray), cb); ProcCount := cb div SizeOf(DWORD); for i := 0 to ProcCount -1 do begin hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PIDArray[I]); if (hProcess <> 0) then begin EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb); GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName)); List.Add(ModuleName); CloseHandle(hProcess); end; end; end; procedure GetProcessList(var List: TStringList); var ovi: TOSVersionInfo; begin if List = nil then Exit; ovi.dwOSVersionInfoSize := sizeof(TOSVersionInfo); GetVersionEx(ovi); case ovi.dwPlatformId of VER_PLATFORM_WIN32_WINDOWS : CreateWin9xProcessList(List) ; VER_PLATFORM_WIN32_NT : CreateWinNTProcessList(List) ; end end; function IsEXERunning(sFileName: String; bFullpath: Boolean): Boolean; var i: Integer; MyProcList: TStringList; begin MyProcList := TStringList.Create; try GetProcessList(MyProcList) ; Result := False; if MyProcList = nil then Exit; for i := 0 to MyProcList.Count -1 do begin if not bFullpath then begin if CompareText(ExtractFileName(MyProcList.Strings[i]), sFileName) = 0 then Result := True end else if CompareText(MyProcList.Strings[i], sFileName) = 0 then Result := True; if Result then Break; end; finally FreeAndNil(MyProcList); end; end; procedure TForm1.Button1Click(Sender: TObject); begin if IsEXERunning('delphi32.exe', False) then ShowMessage('Läuft schon... *bääh*') else ShowMessage('Läuft nicht... :-)'); end; Grüsse, Daniel :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz