2Pascal-新时代的Pascal

 找回密码
 立即注册
搜索
热搜: fastreport
查看: 859|回复: 3
打印 上一主题 下一主题

通过进程名获取该进程的完整路径的问题~

[复制链接]

5

主题

15

帖子

74

积分

注册会员

Rank: 2

积分
74
跳转到指定楼层
楼主
发表于 2018-10-9 12:49:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
京东数码购物支持本站
delphi XE 10.2.3,用下面的函数: 【调用是: ShowMessage(GetPathFileofModule('explorer.exe'));     要uses TlHelp32,psapi;】在32位系统下可以获取到路径,但是在64位系统下就不行了。寻大神指点~~~~

[mw_shl_code=delphi,true]function GetPathFileofModule(ModuleName:String):String; //枚举进程文件所在路径
var
hProcSnap: THandle;
pProcess: THandle;
pe32: TProcessEntry32;
buf:array[0..MAX_PATH] of char;
hMod:HMODULE;
cbNeededWORD;
begin
hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
if hProcSnap = INVALID_HANDLE_VALUE then Exit;
pe32.dwSize := SizeOf(ProcessEntry32);
if Process32First(hProcSnap, pe32) = True then
while Process32Next(hProcSnap, pe32) = True do
begin
if uppercase(pe32.szExeFile)=uppercase(ModuleName) then
begin
pProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ,
FALSE,
pe32.th32ProcessID);
if pProcess<>0 then
begin
if EnumProcessModules( pProcess,@hMod,sizeof(hMod),cbNeeded) then
begin
ZeroMemory(@buf,MAX_PATH+1);
GetModuleFileNameEx(pProcess, hMod,buf,MAX_PATH+1);
Result:=strpas(buf);
end;
end;
end;
end;
CloseHandle(hProcSnap);
end;[/mw_shl_code]


回复

使用道具 举报

5

主题

15

帖子

74

积分

注册会员

Rank: 2

积分
74
沙发
 楼主| 发表于 2018-10-9 14:15:18 | 只看该作者
京东数码购物支持本站
查网上资料发现,可以用QueryFullProcessImageName 这个函数,最低要求VISTA系统,XP太老了,这个函数可以用! 但是不知道怎么利用~
回复 支持 反对

使用道具 举报

5

主题

15

帖子

74

积分

注册会员

Rank: 2

积分
74
板凳
 楼主| 发表于 2018-10-9 15:26:47 | 只看该作者
京东数码购物支持本站
[mw_shl_code=delphi,true]function NazwaProcesu(const uchwyt: Thandle): string;
type
  TQueryFullProcessImageName = function(hProcess: Thandle; dwFlags: DWORD; lpExeName: PChar; nSize: PDWORD): BOOL; stdcall;
var
  pid: DWORD;
  hProcess: Thandle;
  sciezka: array [0 .. MAX_PATH - 1] of Char;
  QueryFullProcessImageName: TQueryFullProcessImageName;
  nSize: cardinal;
begin
  Result := '';
  GetWindowThreadProcessId(uchwyt, pid);
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, pid);
  if hProcess <> 0 then
    try
      if GetModuleFileNameEX(hProcess, 0, sciezka, MAX_PATH) <> 0 then Result := sciezka
      else if Win32MajorVersion >= 6 then
      begin
        nSize := MAX_PATH;
        ZeroMemory(@sciezka, MAX_PATH);
        @QueryFullProcessImageName := GetProcAddress(GetModuleHandle('kernel32'), 'QueryFullProcessImageNameW');
        if Assigned(QueryFullProcessImageName) then
          if QueryFullProcessImageName(hProcess, 0, sciezka, @nSize) then Result := sciezka
      end;
    finally
      CloseHandle(hProcess);
    end;
end;[/mw_shl_code]

网上找的一段代码,不知道 怎么调用,比如说知道有个进程 explorer.exe 怎么调用这个函数呢? 大神指点一下~
回复 支持 反对

使用道具 举报

1

主题

22

帖子

69

积分

注册会员

Rank: 2

积分
69
地板
发表于 2018-12-17 12:35:00 | 只看该作者
京东数码购物支持本站
xe10.2.3都不支持winxp了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|新时代Pascal论坛

GMT+8, 2024-4-30 10:17 , Processed in 0.071360 second(s), 23 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表