根据PID得到应用程序的绝对路径?

jfscj 2006-05-27 08:17:10
得到一个早已打开的程序AA.EXE 得到它的PID后.这个PID的值和WINDOWS里的任务管理器中PID列显示的值是一样的.如何根据这个PID得到这个PID所对应AA.EXE程序在电脑中的绝对路径??

请高手指点.谢谢
...全文
311 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jfscj 2006-05-29
  • 打赏
  • 举报
回复
结帖.谢谢各位的回答,
问题我自己已经解决了.
lsftest 2006-05-28
  • 打赏
  • 举报
回复
wmi的win32_process类的ExecutablePath属性。。。
verywzm 2006-05-28
  • 打赏
  • 举报
回复
'http://topic.csdn.net/t/20050525/20/4035607.html

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long

Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long

Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

'根据进程号获取进程路径函数,原创:
Function GetProcessPathByProcessID(ByVal PID As Long) As String
On Error GoTo Z
Dim cbNeeded As Long
Dim szBuf(1 To 250) As Long
Dim Ret As Long
Dim szPathName As String
Dim nSize As Long
Dim hProcess As Long
hProcess = OpenProcess(&H400 Or &H10, 0, PID)
If hProcess <> 0 Then
Ret = EnumProcessModules(hProcess, szBuf(1), 250, cbNeeded)
If Ret <> 0 Then
szPathName = Space(260)
nSize = 500
Ret = GetModuleFileNameExA(hProcess, szBuf(1), szPathName, nSize)
GetProcessPathByProcessID = Left(szPathName, Ret)
End If
End If
Ret = CloseHandle(hProcess)
If GetProcessPathByProcessID = "" Then
GetProcessPathByProcessID = "SYSTEM"
End If
Exit Function
Z:
End Function

'我的系统VB进程ID为1716
'下面的结果显示了VB进程的路径为:D:\Microsoft Visual Studio\VB98\VB6.EXE

Private Sub Command1_Click()
MsgBox GetProcessPathByProcessID(2256)
End Sub


51365133 2006-05-27
  • 打赏
  • 举报
回复
jfscj() ( ) 信誉:100 2006-05-27 21:11:00 得分: 0


我是想求一个VB中的API调用.
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

你真让我伤心
TechnoFantasy 2006-05-27
  • 打赏
  • 举报
回复
参考:
http://experts.about.com/q/Visual-Basic-1048/Kill-Process-VB-its-1.htm
jfscj 2006-05-27
  • 打赏
  • 举报
回复
我是想求一个VB中的API调用.
51365133 2006-05-27
  • 打赏
  • 举报
回复
/*
Copyright: 2005---2008 Ver 1.20
Author: 渊海
Date: 29-03-06 17:32
Description: 如果我的东西对你有所帮助,请你保留此信息。
*/

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>

BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);
void DispProcess(void);
void DispPrsFile(void);

//=================================================
typedef BOOL (_stdcall *ENUMPROCESSES)( //注意这里要指明调用约定为-stdcall
DWORD* pProcessIds, //指向进程ID数组链
DWORD cb, //ID数组的大小,用字节计数
DWORD* pBytesReturned); //返回的字节
//在psapi.dll中的函数EnumProcessModules用来枚举进程模块
typedef BOOL (_stdcall *ENUMPROCESSMODULES)(
HANDLE hProcess, //进程句柄
HMODULE* lphModule, //指向模块句柄数组链
DWORD cb, //模块句柄数组大小,字节计数
LPDWORD lpcbNeeded); //存储所有模块句柄所需的字节数
//在psapi.dll中的函数GetModuleFileNameEx获得进程模块名
typedef DWORD (_stdcall *GETMODULEFILENAMEEX)(
HANDLE hProcess, //进程句柄
HMODULE hModule, //进程句柄
LPTSTR lpFilename, //存放模块全路径名
DWORD nSize //lpFilename缓冲区大小,字符计算
);
//=================================================
//=================================================
int main()
{
//DispProcess();
DispPrsFile();
return 0;
}

//提升进程权限
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{

TOKEN_PRIVILEGES tkp;

LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限

return( (GetLastError()==ERROR_SUCCESS) );
}
void DispProcess(void)
{
HANDLE hSnapshot;
PROCESSENTRY32 pe;
BOOL bSucceed;
TCHAR * szFileName = NULL;
DWORD dwProcessID = 0;

HANDLE hToken;
if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
{
if (EnablePrivilege(hToken,SE_DEBUG_NAME))
{
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

bSucceed = Process32First(hSnapshot, &pe);

while(bSucceed)
{
printf("\n%d\t%s",pe.th32ProcessID,pe.szExeFile);
bSucceed = Process32Next(hSnapshot, &pe);
}
}
}
CloseHandle(hSnapshot);
system("pause");
}
void DispPrsFile(void)
{
DWORD processid[1024],needed,processcount,i;
HANDLE hProcess;
HMODULE hModule;
char path[MAX_PATH] = "",temp[256];
HMODULE hPsDll = LoadLibrary("PSAPI.DLL");
//=======================================================
ENUMPROCESSES pEnumProcesses = (ENUMPROCESSES)GetProcAddress(hPsDll, "EnumProcesses");
ENUMPROCESSMODULES pEnumProcessModules = (ENUMPROCESSMODULES)GetProcAddress(hPsDll, "EnumProcessModules");
GETMODULEFILENAMEEX pGetModuleFileNameEx = (GETMODULEFILENAMEEX)GetProcAddress(hPsDll, "GetModuleFileNameExA");
//========================================================
HANDLE hToken;

if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
{
if (EnablePrivilege(hToken,SE_DEBUG_NAME))
{

pEnumProcesses(processid, sizeof(processid), &needed);
processcount=needed/sizeof(DWORD);
for (i=0;i<processcount;i++)
{
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
if (hProcess)
{
pEnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
pGetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
GetShortPathName(path,path,256);
itoa(processid[i],temp,10);
printf("%s --\t\t-- %s\n",path,temp);
}
}
}
}

//CloseHandle(hPsDll);
//CloseHandle(hModule);
//CloseHandle(hProcess);

itoa(processcount,temp,10);
printf("\nProcess Count:%s\n\n",temp);

system("pause");
}

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧