想在程序中取得当前路径,该如何作?
我想编个程序监控机器上运行的应用程序?该怎么办?
比方:
运行一个word,我就把 word.path\word.exe 运行时间等记录下来
运行一个OICQ,我就把 OICQ.path\OICQ.exe 运行时间等记录下来
...我用GetCurrentDir..()每次去出来的路径都是时应用程序自身所在的路径。
希望用DELPHI5.0-6.0的代码? 我是菜鸟,大虾,多指教!!!
我想编个程序监控机器上运行的应用程序?该怎么办?
比方:
运行一个word,我就把 word.path\word.exe 运行时间等记录下来
运行一个OICQ,我就把 OICQ.path\OICQ.exe 运行时间等记录下来
...我用GetCurrentDir..()每次去出来的路径都是时应用程序自身所在的路径。
希望用DELPHI5.0-6.0的代码? 我是菜鸟,大虾,多指教!!!
function Getpath: string;
var
path : string;
i : integer;
begin
path := application.ExeName;
for i := length(path) - 1 downto 0 do
begin
if pchar(path)[i] = '\' then
break;
end;
result := copy(path, 1, i);end;
请看例子::
具个例子:(设可执行程序monitor.exe(用的delphi写))
step1 : 运行D:\monitor.exe
step2 :运行C:\Word.exe
step3 :monitor.exe取得(如何取得?)"C:\word.exe"字符串写入log文件(假设为monitor.Log)。
...
...
现在是monitor如何知道某个程序将要/正在被操作系统执行??(见step3:),monitor中如何解决这个问题??
请继续回答...
procedure TForm1.Button1Click(Sender: TObject);
var
pe:PROCESSENTRY32;
me:MODULEENTRY32;
hp,hm:Thandle;
b,b1:boolean;
begin
hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
pe.dwSize:=SizeOf(pe);
b:=Process32First(hp,pe);
while b do
begin
hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);
me.dwSize:=sizeof(ModuleEntry32);
if Module32First(hm,me) then
begin
b1:=Module32First(hm,me);
while b1 do
begin
if me.th32ModuleID=pe.th32ModuleID then
listbox1.Items.Add(me.szExePath);
b1:=Module32Next(hm,me);
end;
end;
b:=Process32Next(hp,pe);
end; end; 而在NT系统中由于不支持toolhelp api,故
#include "psapi.hpp" 假使process id是 pid 的话: HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,pid);
if( NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
{
char buf[MAX_PATH+1]="";
if(GetModuleBaseName( hProcess, hMod,buf,sizeof buf)>0)
//
// buf放的就是名字
//
}
CloseHandle(hProcess);
}
(注意该程序运行需要psapi.dll,所以要copy到别的机器上运行时需连同该文件一起拷贝。当然如果装了delphi或者c++ builder就不需要了)转-富翁论坛
上面的文章可以让你如何根据一个PROCESSID去得到它的文件名,你也就不用这么辛苦的去做其它的事了