Application.ExeName
ExtractFilePath()
siehe onlinehilfe...
--
Moritz Franckenstein
mailto:maf-...@gmx.net
http://www.maf-soft.de/
icq: 22030984 y!: maf_soft
Vollständiger Programm-Pfad: ParamStr(0)
Verzeichnis des Programms: ExtractFilePath(ParamStr(0))
Nur Name des Programms: ExtractFileName(ParamStr(0))
Gruss, Jens
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.
"
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;
"
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
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?
> 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?
OH: ExtractFilePath
> 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.
GENIAL!
danke dir
> 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
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 ...
[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]
oder greife meinen vorschlag mit dem mutex (google) auf.