ale jeśli chcesz to zrobić bez madshi collection, to już wcale nie taki banał:
function GetCmdLine(hProcess : thandle) : string; overload;
var
h2 : thandle;
PROCESSENTRY32 : TPROCESSENTRY32;
i,j : cardinal;
buf : array of char;
memStart : pointer;
memInfo : MEMORY_BASIC_INFORMATION;
s : string;
begin
result := '';
h2 := OpenProcess (PROCESS_ALL_ACCESS, FALSE, hProcess);
if h2 = 0 then exit;
memstart := pointer($20000);
while VirtualQueryEx(h2, memstart, memInfo, SizeOf(MEMORY_BASIC_INFORMATION)) = SizeOf(MEMORY_BASIC_INFORMATION) do
begin
if (meminfo.State = MEM_COMMIT) then
begin
setlength(buf,meminfo.RegionSize);
if ReadProcessMemory(h2, memInfo.BaseAddress, buf, memInfo.RegionSize, i) then
begin
move(buf[1176],buf[0],meminfo.RegionSize-1176);
i := Pos(#0#0,string(buf));
move(buf[i+6],buf[0],meminfo.RegionSize-i-6);
i := pos(#0#0,string(buf));
while buf[i] = #0 do inc(i);
move(buf[i],buf[0],meminfo.RegionSize-i);
j := pos(#0#0,string(buf)) div 2;
setlength(s,j);
for i := 0 to j-1 do s[i+1] := buf[i*2];
result := s;
break;
end;
buf := nil;
end;
integer(memstart) := integer(meminfo.BaseAddress) + meminfo.regionsize;
end;
CloseHandle(h2);
end;
function GetCmdLine(path : string) : string; overload;
var
h,h2 : thandle;
PROCESSENTRY32 : TPROCESSENTRY32;
i,j : cardinal;
begin
result := '';
h2 := 0;
h := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32.dwSize := SizeOf(PROCESSENTRY32);
if not Process32First(h,PROCESSENTRY32) then i := getlasterror;
repeat
if PROCESSENTRY32.szExeFile = path then
begin
h2 := PROCESSENTRY32.th32ProcessID;
break;
end;
until not Process32Next(h,PROCESSENTRY32);
CloseHandle(h);
if h2 = 0 then exit;
result := GetCmdLine(h2);
end;
trzeba też dodać TlHelp32 do sekcji uses.
cmdline działa tylko dla procesów uruchomionych przez użytkownika, pewnie brakuje odpowiednich praw przy otwieraniu procesu, ale nie chce mi się nad tym siedzieć.
całość na http://fronczyk.no-ip.com/pub/readprocesscmdline.zip , o ile mam włączony komputer