Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Pfad eines laufenden Programmes ermitteln

114 views
Skip to first unread message

Moritz Franckenstein

unread,
Aug 21, 2002, 5:56:01 AM8/21/02
to
Marc Geldon <ma...@geldon.de> wrote:
> Den Pfad eines laufenden Programmes möchte ich gerne ermitteln. Also
> ich möchte erstmal feststellen ob das Programm läuft (mit Hilfe des
> ausführbaren Namens, z.B. PROGRAMM.EXE) und dann möchte ich zu diesem
> Programm den Pfad in dem es läuft herausfinden.

Application.ExeName
ExtractFilePath()

siehe onlinehilfe...

--
Moritz Franckenstein
mailto:maf-...@gmx.net
http://www.maf-soft.de/
icq: 22030984 y!: maf_soft

Jens-Erich Lange

unread,
Aug 21, 2002, 6:02:05 AM8/21/02
to
"Marc Geldon" <ma...@geldon.de> schrieb im Newsbeitrag
news:ajvnir$52l$03$1...@news.t-online.com...
> Hallo!

>
> Den Pfad eines laufenden Programmes möchte ich gerne ermitteln. Also ich
> möchte erstmal feststellen ob das Programm läuft (mit Hilfe des ausführbaren
> Namens, z.B. PROGRAMM.EXE) und dann möchte ich zu diesem Programm den Pfad
> in dem es läuft herausfinden.

Vollständiger Programm-Pfad: ParamStr(0)
Verzeichnis des Programms: ExtractFilePath(ParamStr(0))
Nur Name des Programms: ExtractFileName(ParamStr(0))

Gruss, Jens


Moritz Franckenstein

unread,
Aug 21, 2002, 6:14:23 AM8/21/02
to
Marc Geldon <ma...@geldon.de> wrote:
> Danke für deine Antwort. Ich meine aber den Pfad eines
> Fremdprogrammes. Mein Programm soll feststellen ob das Programm
> "BLABLA.EXE" läuft und wenn es läuft soll es den Pfad ausgeben.

Hehe, das kommt davon, wenn man nach dem ersten satz schon glaubt, alles
verstanden zu haben und den rest dann nur noch überfliegt :) aber
beruhigenderweise ist nicht nur mir dieser fehler unterlaufen...

Also dafür weiß ich keine lösung, würde mich auch sehr interessieren. Es ärgert
mich regelmäßig, daß der taskmanager nur die namen der prozesse anzeigt, aber
keine verzeichnisse...

Falls du das andere programm auch selbstschreibst, oder es sogar das gleiche
programm ist und du nur sicherstellen willst, daß es nicht mehrmals läuft,
helfen dir sogenannte mutexe, das klappt dann sogar, wenn jemand die andere
datei umbenannt hat.

Paul Meyer

unread,
Aug 21, 2002, 6:35:51 AM8/21/02
to
Habe mal ein wenig bei Google.de gesucht, hier drei Proc's, eine davon von
mir:

"
Uses ... tlhelp32;

Function KillTaskByFileName(FileName:String):integer;
var
ContinueLoop:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
const
PROCESS_TERMINATE=$0001;
begin
FileName := Trim(FileName);
Result := 0;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do begin
if
((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(FileName))
or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName))) then
Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),
FProcessEntry32.th32ProcessID),0));
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
"


"
Leider gehen Windows 9x/2000 hier einen völlig anderen Weg als Windows NT
4.0. Erstgenannte verwenden dafür den "TProcessEntry32"-Typen aus der Unit
"TlHelp32". Die Funktionen aus dieser Unit sind aber nur in der Kernel32-DLL
von Windows 9x/2000 definiert. Hier ein Beispiel von Christian Kästner:
uses TlHelp32, ShellApi;

var
ProcID : DWord;
SSHandle : THandle;
Continue : boolean;
ProcEntry : TProcessEntry32;
begin
GetWindowThreadProcessID(FindWindow('Fenstertitel',nil), @ProcID);
SSHandle := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
ProcEntry.dwSize := Sizeof(ProcEntry);
FileList.Items.Clear;
// gehe alle Prozesse durch (m.H. der TlHelp32 - Unit)
Continue := Process32First(SSHandle, ProcEntry);
while Continue do begin
// gesuchter Prozess (ProcID) in der Liste aller Prozesse gefunden?
if ProcEntry.th32ProcessID = ProcID then
FileList.Items.Add(ProcEntry.szExeFile);
Continue := Process32Next(SSHandle, ProcEntry);
end;
CloseHandle(SSHandle);
end;


Unter Windos NT 4.0 verwendet man statt dessen die Funktion
"GetModuleBaseName" aus der Library PSAPI.DLL. Diese Funktion ist wiederum
unter Win9x/2000 nicht definiert, also funktioniert folgendes Beispiel von
Christo Crause nur unter Windows NT 4.0:
interface

type
TPIDlist = array[0..1000] of DWORD;

function EnumProcesses (pidList : PInteger; cb : Integer; var cbNeeded :
Integer): boolean; stdcall;

function GetModuleBaseName (hProcess : THandle; module : HInst; BaseName :
Pchar; size : Integer) : Integer; stdcall;

implementation

const psapidll = 'psapi.dll';

var PID : TPIDlist;

function EnumProcesses; external psapidll;
function GetModuleBaseName; external psapidll name 'GetModuleBaseNameA';

function GetProcessList(var PIDlist : TPIDlist): integer;
var cb, cbNeeded : integer;
begin
cbNeeded := 0;
cb := SizeOf(PIDlist);
FillChar(PIDlist, cb, 0);
if not EnumProcesses(@PIDlist, cb, cbNeeded) then
cbNeeded := 0
else
cbNeeded := cbNeeded div SizeOf(DWord);
Result := cbNeeded;
end;

procedure GetProcessNames;
var numProcesses : integer;
ProcHandle : THandle;
ExeName : string;
begin
numProcesses := GetProcessList(PIDlist);
for i := 0 to numProcesses-1 do begin
ProcHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, PIDlist[i]);
if ProcHandle <> 0 then begin
try
if GetModuleBaseName(ProcHandle, 0, @szName, sizeof (szName)) > 0 then
ExeName := szName
else
ExeName := 'System';
finally
CloseHandle(ProcHandle)
end;
end
else
if PIDlist[i] = 0 then
ExeName := 'System idle';
end;
"


Joachim Duerr

unread,
Aug 21, 2002, 8:07:53 AM8/21/02
to
> Den Pfad eines laufenden Programmes möchte ich gerne ermitteln. Also ich
> möchte erstmal feststellen ob das Programm läuft (mit Hilfe des
ausführbaren
> Namens, z.B. PROGRAMM.EXE) und dann möchte ich zu diesem Programm den Pfad
> in dem es läuft herausfinden.
>
> Wie lässt sich sowas realisieren? Hat jemand einen Tip?

Was machst du, wenn PROGRAMM.EXE einmal aus C:\, einmal aus
C:\WinNT\Programme und einmal aus C:\Temp gestartet wurde?
Zu einem Programm gehört immer auch eine Pfadangabe, da es sich sonst nicht
eindeutig spezifizieren läßt.

--
Joachim Duerr
Lead ADS Support, Extended Systems Germany
mailto:adva...@extendsys.de
http://www.extendsys.de/getadvantage

Moritz Franckenstein

unread,
Aug 21, 2002, 8:13:35 AM8/21/02
to
Joachim Duerr <adva...@nospam.extendsys.de> wrote:
> Was machst du, wenn PROGRAMM.EXE einmal aus C:\, einmal aus
> C:\WinNT\Programme und einmal aus C:\Temp gestartet wurde?
> Zu einem Programm gehört immer auch eine Pfadangabe, da es sich sonst
> nicht eindeutig spezifizieren läßt.

Kommt ganz drauf an, wozu er das braucht... Außerdem könnte es von einem pfad
auch mehrmals gestartet sein.

Also, -> marc, was willst du damit eigentlich?

Audrone Kezyte-Hertelt

unread,
Aug 21, 2002, 10:25:16 AM8/21/02
to
"Joachim Duerr" <adva...@nospam.extendsys.de> schrieb

> Was machst du, wenn PROGRAMM.EXE einmal aus C:\, einmal aus
> C:\WinNT\Programme und einmal aus C:\Temp gestartet wurde?

Wie kann ch jetzt "Programme" aus dem ermittelten Pfad löschen, so dass ich
nur "C:\WinNT\" habe?


Joachim Duerr

unread,
Aug 21, 2002, 11:28:54 AM8/21/02
to
> Wie kann ch jetzt "Programme" aus dem ermittelten Pfad löschen, so dass
ich
> nur "C:\WinNT\" habe?

OH: ExtractFilePath

Sven Lanoster

unread,
Aug 21, 2002, 12:17:43 PM8/21/02
to
Moritz Franckenstein schrieb:

> interessieren. Es ärgert mich regelmäßig, daß der taskmanager
> nur die namen der prozesse anzeigt, aber keine verzeichnisse...

Falls Du auf Deinem System irgendwo msinfo32.exe (Microsoft
Systeminfo) liegen hast, kammst Du Dir auch die Verzeichnisse ansehen
(unter "Softwareumgebung").

MfG,
Sven.

Moritz Franckenstein

unread,
Aug 21, 2002, 12:36:42 PM8/21/02
to
Sven Lanoster <SvenLa...@gmx.de> wrote:
>> interessieren. Es ärgert mich regelmäßig, daß der taskmanager
>> nur die namen der prozesse anzeigt, aber keine verzeichnisse...
>
> Falls Du auf Deinem System irgendwo msinfo32.exe (Microsoft
> Systeminfo) liegen hast, kammst Du Dir auch die Verzeichnisse ansehen
> (unter "Softwareumgebung").

GENIAL!
danke dir

Simon Reinhardt

unread,
Aug 22, 2002, 3:38:26 AM8/22/02
to
"Marc Geldon" <ma...@geldon.de> schrieb in
news:ajvnir$52l$03$1...@news.t-online.com:

> Den Pfad eines laufenden Programmes möchte ich gerne ermitteln. Also
> ich möchte erstmal feststellen ob das Programm läuft (mit Hilfe des
> ausführbaren Namens, z.B. PROGRAMM.EXE) und dann möchte ich zu diesem
> Programm den Pfad in dem es läuft herausfinden.
>
> Wie lässt sich sowas realisieren? Hat jemand einen Tip?

Hilfe zu diesem Thema (und zu vielen anderen) findest Du in meiner Delphi
Fundgrube (Abschnitt "Interaktion..").


Simon
--
Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand
ginge, um zu sehen, wohin wir kämen, wenn wir gingen...
* Homepage: http://www.picsoft.de
* Delphi Fundgrube: http://www.delphi-fundgrube.de

Schind

unread,
Aug 23, 2002, 3:14:55 AM8/23/02
to
"Marc Geldon" <ma...@geldon.de> wrote in message news:<ak3l1h$spf$03$1...@news.t-online.com>...
> Wir entwickeln eine Zusatzsoftware zu einem Programm. Unser Programm darf /
> kann nur ausgeführt werden wenn das Hauptprogramm läuft.
>
>
> Gruss,
>
> Marc Geldon
>
>
> "Moritz Franckenstein" <maf-...@gmx.net> schrieb im Newsbeitrag
> news:ak004a$1eb2jg$1...@ID-19882.news.dfncis.de...

Also ich hab nicht die ganze Disc verfolgt, aber die GetDir-Funktion /Procedure

GetDIR(0,variable);

hilft vielleicht ...

0 -steht für aktuelles Laufwerk

also was gerade focusiert ist..

1-4 für A: .. D: und so weiter ...

Udo Nesshoever

unread,
Aug 23, 2002, 3:30:59 AM8/23/02
to
Hi Marc,

[TOFU geloescht]
Bitte mal Netiquette[1] und Quoting-Tips[2] lesen. Danke!

>Wir entwickeln eine Zusatzsoftware zu einem Programm. Unser Programm darf /
>kann nur ausgeführt werden wenn das Hauptprogramm läuft.

Wenn das Hauptprogramm auch von euch ist, schickt doch vom
Zusatzprogramm eine Message, die vom Hauptprogramm in angemessener Zeit
beantwortet werden muss.

Cheers,
Udo

=== footnotes ===
[1] http://www.kirchwitz.de/~amk/dni/netiquette/
http://www.usenet-abc.de/
[2] http://learn.to/quote/
--
Homepage: http://www.nesshoever.de/ [No mails please. Reply here.]
Delphi: W2K.sp2, D4Pro.sp3, D6Pro.sp2 [dcld-KUSS-Kasse: 105 Lewonzen]

Moritz Franckenstein

unread,
Aug 23, 2002, 5:03:23 AM8/23/02
to
Udo Nesshoever <newsgrou...@gmx.net> wrote:
>> Wir entwickeln eine Zusatzsoftware zu einem Programm. Unser Programm
>> darf / kann nur ausgeführt werden wenn das Hauptprogramm läuft.
>
> Wenn das Hauptprogramm auch von euch ist, schickt doch vom
> Zusatzprogramm eine Message, die vom Hauptprogramm in angemessener
> Zeit beantwortet werden muss.

oder greife meinen vorschlag mit dem mutex (google) auf.

Message has been deleted
Message has been deleted
Message has been deleted
0 new messages