如何根据一个文件名找到它的绝对路径?(100分)

  • 主题发起人 主题发起人 kindly
  • 开始时间 开始时间
K

kindly

Unregistered / Unconfirmed
GUEST, unregistred user!
例如有一个notepad.exe,在任意一个目录都可以执行,现在我知道notepad这个名字(注意是
notepad,不是notepad.exe),我怎样才能知道它是在哪个路径下面呢,不要说分析PATH变量,
这样太麻烦了,我觉得系统应该提供了这方面的功能。
 
procedure TForm1.Button1Click(Sender: TObject);
var
Handle: THandle;
begin
Handle := LoadLibrary(PChar(ChangeFileExt('notepad', '.EXE')));
try
if Handle <> 0 then ShowMessage(GetModuleName(Handle));
finally
FreeLibrary(Handle);
end;
end;
 
GetModuleNameex函数
 
我用GetModuleFileName解决了,谢谢各位
刚才看了一下,getModuleName是Sysutil里面的一个内部调用函数,也就是调用
GetModuleFileName的,编译时找不到的
不知tseug的代码编译通过了没有?我是D5
另外GetModuleNameEx API在哪里?没有找到
 
extractfilepath
 
uses
psapi;
…………
var
ModName : array [0..MAX_PATH-1] of Char;
if GetModuleFileNameEx(OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,
ProcessStruct.th32ProcessID),0,@ModName[0],SizeOf(ModName))>0 then
Result:=ModeName
……
 
那个没有问题,在D6下肯定能用。。。
 
ProcessStruct.th32ProcessID 为进程ID
 
Var
ModName : array[0..MAX_PATH] of char;
hModule : THandle;
begin
hModule:=LoadLibrary(PChar(ChangeFileExt('notepad', '.EXE')));
if hModule<>0 then
begin
GetModuleFileName(hModule,@ModName, sizeof(ModName));
Result:=ModMame;
FreeLibrary(hModule);
……
end;
其中GetModuleFileName,包含在windows中,所有以一下子就找到了
如果GetModuleFileNameEx还有什么问题跟我联系吧!这个是现在大部分
程序用的标准函数,那个GetModuleFileName则比较老了,在2000下面还有很多问题的
 
我用的就是duducat最后贴的方法,2000下会有问题吗?我仅仅是获得全路径,现在在试
GetModuleFileNameEx...
 
我现在知道一个notepad,如何得到ProcessID?我并不启动这个程序
 
to tseug:
那可能是D6的Sysutils把这个函数声明出来了,D5的只有实现,没有在Implementation
前面声明
 
好吧,好事情作到底!
uses
TLHelp32,PsApi;
……
var
ok : Integer;
ModName : array [0..MAX_PATH] of Char;
ProcessListHandle: THandle;//进程列表的句柄
ProcessStruct : TProcessEntry32;//进程的结构,进程的信息都在这个结构里面
begin
ProcessListHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPProcess,0);
//首先给出进程结构的大小
ProcessStruct.dwSize:=Sizeof(ProcessStruct);
//得到第一个进程
ok:=Process32First(ProcessListHandle,ProcessStruct);
while integer(ok)<>0 do
begin
if GetModuleFileNameEx(OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,
ProcessStruct.th32ProcessID),0,@ModName[0],SizeOf(ModName))>0 then
Result:=ModName;
……
ok:=Process32Next(ProcessListHandle,ProcessStruct);
end;
//在98,2000,xp,nt下都能运行
 
以上可用列出所以进程,加个判断就可以找到notepod.exe了
 
ok,duducat谢谢你,你写的程序我也写过,但是我现在没有把notepad调入内存,从何找
它的进程ID呢?我现在用LoadLibrary调入文件,但是有些exe会报错,报无效的image,
原因正在查,实在不行只好分析PATH,自己去找了,再次谢谢你的帮助
 
to duducat
我在 98 下得到的 result 怎么全是空的??????
 
后退
顶部