最近想写个进程管理程序,目前已经能获得系统进程,以及线程数,但是想获得系统进程的路径,请高手指点一二。

解决方案 »

  1.   

    DWORD GetModuleFileNameEx(
      HANDLE hProcess,
      HMODULE hModule,
      LPTSTR lpFilename,
      DWORD nSize
    );
      

  2.   

    做内核 建议看windows核心编程 里面写得很详细啊
      

  3.   

    void CDemoDlg::OnButton1() 
    {
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )  //receive all the Process ID Saved in aProcesses
    {::MessageBox(NULL,TEXT(""),TEXT("Can not EnumProsses"),0);return;} HANDLE hProcess = NULL; //进程句柄
    TCHAR szProcessName[MAX_PATH] ={0}; //进程的名称
    TCHAR szProcessPath[MAX_PATH] ={0}; //进程路径
    HMODULE hMod=NULL; //进程的第一个模块
        DWORD ModulecbNeeded; //储存进程模块的大小 cProcesses = cbNeeded / sizeof(DWORD); //the total of Process ID
    for (int i = 0; i < cProcesses; i++ )
    {
    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, aProcesses[i]);//get the handle of every Process which is Indentified by Process ID
            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &ModulecbNeeded) ) // 列举某个进程的模块,第一个模块就是创建此进程的主exe程序 
    {
    if (    GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ) //获得程序名
         && GetModuleFileNameEx( hProcess, hMod, szProcessPath, sizeof(szProcessPath))  )//获得模块路径
    {
    sprintf(szProcessName+10, "  %s",szProcessPath); //与上一句同效,但执行速度欠佳
    ::SendMessage(::GetDlgItem(m_hWnd,IDC_LIST1),LB_ADDSTRING,0,(LPARAM)szProcessName);
    }
    }
    CloseHandle(hProcess);
    }
    }示例代码:http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC%5EM%5EM/EnumProcess.zip
      

  4.   

    不知楼主的进程管理程序要写到什么水平哦,楼上几位给的代码会被Rootkit破坏的。建议驱动。
      

  5.   

    仔细看看GetModuleFileNameEx的MSDN说明吧这个或许对你有用,但用C#写的,
    http://blog.csdn.net/RFEZGC/archive/2009/07/26/4382458.aspx进程路径:你看看每个进程的第一个模块,其实就是进程的信息。GetModuleFileNameEx获取某个进程的第一个模块的路径其实就是进程的路径。
      

  6.   

    嗯,我用3楼的方法,想获得进程路径,但是 EnumProcessModules这个函数在WIN32中找不到用法,想知道怎么用。
    还有能根据进程ID获得进程名称,也知道获得进程的第一个模块就是进程路径,但是有没有哪位高手给指点下,如何实现。
      

  7.   

    GetModuleFileName
    这个路径带着最后得exe,可以使用。path把最后得exe去掉
      

  8.   

    以前是没有找到EnumProcesses函数在那个头文件里包含,今天找到了,但是编译连接中提示1>正在链接...
    1>MyFun.obj : error LNK2019: 无法解析的外部符号_GetModuleFileNameExA@16,该符号在函数"public: void __thiscall CMyProgressDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CMyProgressDlg@@QAEXXZ) 中被引用
    1>MyFun.obj : error LNK2019: 无法解析的外部符号_EnumProcessModules@16,该符号在函数"public: void __thiscall CMyProgressDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CMyProgressDlg@@QAEXXZ) 中被引用
    1>Debug\MyProgress.exe : fatal error LNK1120: 2 个无法解析的外部命令
    请问如何解决?