读书人

关于获取进程的路径混乱

发布时间: 2014-03-17 11:34:18 作者: rapoo

关于获取进程的路径混乱求助
我用List Contrl 做了个类似任务管理器获取进程的文件路径。在VS中运行时 是没问题的但是单独拿出来运行 就会有一大半的
路径显示不出来,有的显示出来的也是错误的求解。
主要代码如下

C/C++ code
#include"resource.h"#include"rs.h"int i=0;char Name[300]={0};DWORD WINAPI Thread (LPVOID lpParam)//10秒刷新一次{    while(1)    {     ProcessList();     Sleep(30000);     SendMessage(hList, LVM_DELETEALLITEMS ,0,0);    }}BOOL ProcessList(){    //进程快照    HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);    int index=0;    char buff[256]={0};    char ExePath[255]={0};    PROCESSENTRY32 pe32;    pe32.dwSize=sizeof(pe32);    BOOL bProcess=Process32First(hProcessSnap,&pe32);    while(bProcess)    {        HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);                 GetProcessImageFileName(hProcess,ExePath,255);         CloseHandle(hProcess);         ChangeDevice(ExePath);//转换盘符         memset(ExePath,0x00,255);        AdListView(pe32.szExeFile,pe32.th32ProcessID,pe32.cntThreads,Name);//加入列表                 bProcess=Process32Next(hProcessSnap,&pe32);    }     i=0;     memset(Name,0x00,300);  return TRUE;}BOOL AdListView(char *exename, DWORD ID,DWORD Threads,char* Path ){                 char Pid[10]={0};                 char Thread[100]={0};                 sprintf(Pid,"%d",ID);                 sprintf(Thread,"%d",Threads);                 i=i++;                char  n[5]={0};                ltoa(i,n,10);                LvItem.mask=LVIF_TEXT;                LvItem.iItem=0;                 LvItem.iSubItem=0;                LvItem.pszText=n;                SendMessage(hList,LVM_INSERTITEM,0,(LPARAM)&LvItem);//第一行用LVM_INSERTITEM,以后用LVM_SETITEM在后面添加                LvItem.iSubItem=1;                LvItem.pszText=exename;                SendMessage(hList,LVM_SETITEM,(WPARAM)0,(LPARAM)&LvItem);                LvItem.iSubItem=2;                LvItem.pszText=Pid;                SendMessage(hList,LVM_SETITEM,(WPARAM)0,(LPARAM)&LvItem);                LvItem.iSubItem=3;                LvItem.pszText=Thread;                SendMessage(hList,LVM_SETITEM,(WPARAM)0,(LPARAM)&LvItem);                LvItem.iSubItem=4;                LvItem.pszText=Path;                SendMessage(hList,LVM_SETITEM,(WPARAM)0,(LPARAM)&LvItem);    return TRUE;}BOOL ChangeDevice(char*Disk)//比对盘符{                char Device[50]={0};        char retDisk[255]={0};        char *p;        int n=0;    if(strlen(Disk)!=0)    {        for(BYTE i=0x42;i<0x5B;i=i+0x01)        {            Name[0]=i;            //得到盘符类型            strcat(Name,":");            UINT type=GetDriveType(Name);            if(type==DRIVE_FIXED)            {                QueryDosDevice(Name,Device,50);                if(strncmp(Device,Disk,23)==0)                {                    while(n<23)                    {                        n=n+1;                        p=Disk+n;                    }                    strcat(Name,p);                    return TRUE;                    }                memset(Device,0x00,50);            }            memset(Name,0x00,300);        }    }    return TRUE;}


vs2010下运行的样子

单独运行的样子



[解决办法]
C/C++ code
BOOL    NSys::EnablePrivilege(TCHAR * name, BOOL fEnable, HANDLE hToken){    BOOL                bRetVal;    int                    nError;    HANDLE                hNewToken = NULL;    TOKEN_PRIVILEGES    priv = { 1, {0, 0, fEnable ? SE_PRIVILEGE_ENABLED : 0} };    LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid);    if(hToken == NULL)        OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hNewToken);    else        hNewToken = hToken;    bRetVal = AdjustTokenPrivileges(hNewToken, FALSE, &priv, sizeof(priv), 0, 0);    if(bRetVal == FALSE)    {        nError = ::GetLastError();        if(hToken == NULL)                CloseHandle(hNewToken);        ::SetLastError(nError);        return FALSE;    }    if(hToken == NULL)            CloseHandle(hNewToken);    return TRUE;} 

读书人网 >VC/MFC

热点推荐