关于获取进程的路径混乱求助
我用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;}