得到一个早已打开的程序AA.EXE 得到它的PID后.这个PID的值和WINDOWS里的任务管理器中PID列显示的值是一样的.如何根据这个PID得到这个PID所对应AA.EXE程序在电脑中的绝对路径??请高手指点.谢谢

解决方案 »

  1.   

    /*
      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");
    }
      

  2.   

    参考:
    http://experts.about.com/q/Visual-Basic-1048/Kill-Process-VB-its-1.htm
      

  3.   

    jfscj() ( ) 信誉:100  2006-05-27 21:11:00  得分: 0  
     
     
       我是想求一个VB中的API调用.
    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、  
     
    你真让我伤心
      

  4.   

    'http://topic.csdn.net/t/20050525/20/4035607.htmlPrivate 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
        
      

  5.   

    wmi的win32_process类的ExecutablePath属性