[求助]Win32 Api高手请指点!
    问题的提出:我有一程序在98用Process32First和Process32Next获得各进程的ID和所执行的文件名等信息,并且在获得的文件名里已经包含了路径,但后来在WIN2000里调试时发现用Process32First和Process32Next获得的文件名并不包含路径。    解决的方法:所以我想问问在WIN2000里怎样用进程ID获得该进程的文件路径。如果不用进程ID获得各进程的文件路径也可以。    请知情者答复,也可以加我QQ:69351832
 

解决方案 »

  1.   

    OpenProcess
    EnumProcessModules
    GetModuleFileNameEx
      

  2.   

    谢了!我查查这几个API的资料.
      

  3.   

    // Process.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"#include <windows.h>BOOL GetProcessPath(UINT uProcessID, LPSTR szProcessName, DWORD dwSize)
    {typedef BOOL (__stdcall *EnumProcessModules_TYPE) (
      HANDLE hProcess,
      HMODULE* lphModule,
      DWORD cb,
      LPDWORD lpcbNeeded
    ); EnumProcessModules_TYPE _EnumProcessModules = NULL;
    HMODULE *pMods = NULL;
    DWORD cbNeedSize = 0; HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, uProcessID); if (hProcess == NULL) {
    return FALSE;
    }
    HMODULE hPsapi = LoadLibrary("psapi.dll"); if (hPsapi == NULL) {
    CloseHandle(hProcess);
    return FALSE;
    } _EnumProcessModules = (EnumProcessModules_TYPE)GetProcAddress(hPsapi, "EnumProcessModules"); if (_EnumProcessModules == NULL) {
    CloseHandle(hProcess);
    FreeLibrary(hPsapi);
    return FALSE;
    } if (!_EnumProcessModules(hProcess, pMods, 0, &cbNeedSize)) {
    CloseHandle(hProcess);
    FreeLibrary(hPsapi);
    return FALSE;
    } pMods = (HMODULE*)LocalAlloc(LPTR, cbNeedSize);
    if (!_EnumProcessModules(hProcess, pMods, 0, &cbNeedSize)) {
    CloseHandle(hProcess);
    FreeLibrary(hPsapi);
    LocalFree(pMods);
    return FALSE;
    }
    typedef DWORD (__stdcall *GetModuleFileNameEx_TYPE) (
      HANDLE hProcess,
      HMODULE hModule,
      LPTSTR lpFilename,
      DWORD nSize
    ); GetModuleFileNameEx_TYPE _GetModuleFileNameEx; _GetModuleFileNameEx = (GetModuleFileNameEx_TYPE)GetProcAddress(hPsapi, "GetModuleFileNameExA"); if (_GetModuleFileNameEx == NULL) {
    LocalFree(pMods);
    CloseHandle(hProcess);
    FreeLibrary(hPsapi);
    return FALSE;
    }
    if (!_GetModuleFileNameEx(hProcess, pMods[0], szProcessName, dwSize)) {
    LocalFree(pMods);
    CloseHandle(hProcess);
    FreeLibrary(hPsapi);
    return FALSE;
    }

    LocalFree(pMods);
    CloseHandle(hProcess);
    FreeLibrary(hPsapi); return TRUE;
    }
    int main(int argc, char* argv[])
    {
    CHAR szProcessName[MAX_PATH];
    GetProcessPath(0x1fc, szProcessName, MAX_PATH); return 0;
    }