技术派-windows开发中常用工具函数汇总

1、提升权限函数

 1 static BOOL EnaleDebugPrivilege()
 2 {
 3     HANDLE hToken;
 4     BOOL fOk = FALSE;
 5 
 6     if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
 7     {
 8         TOKEN_PRIVILEGES tp;
 9         tp.PrivilegeCount = 1 ;
10         ::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
11 
12         tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
13 
14         AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
15         fOk = (ERROR_SUCCESS == GetLastError());
16         CloseHandle(hToken);
17     }
18     return fOk;
19 }

2、增加自启动函数

 1 static void AutoRunRegister()
 2 {
 3     HKEY hKey;
 4     char pathtofile[256] = {0};
 5     HMODULE GetModH = GetModuleHandle(NULL);
 6 
 7     GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile));
 8 
 9     LONG lstatus = RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hKey);
10 
11     if (ERROR_SUCCESS == lstatus)
12     {
13         lstatus = RegSetValueEx(hKey, "ProcessKiller",0,REG_SZ,(const byte *)pathtofile,strlen(pathtofile)+1);
14         RegCloseKey(hKey);
15     }
16 }

3、杀进程函数

 1 BOOL KillProcess(DWORD ProcessId)
 2 {
 3     DWORD error = 0;
 4 
 5     HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,TRUE, ProcessId);
 6 
 7     if(hProcess==NULL)
 8     {
 9         error = ::GetLastError();
10         return FALSE;
11     }
12 
13 
14     if(!TerminateProcess(hProcess,0))
15     {
16         error = ::GetLastError();
17 
18         ::CloseHandle(hProcess);
19 
20         return FALSE;
21     }
22 
23     ::CloseHandle(hProcess);
24     return TRUE;
25 }

4、检查指定进程名是否存活的函数

 1 bool isProcessExist(char *ProcessName, DWORD &processid)
 2 {
 3     bool bExist = 0; 
 4     HANDLE         hProcessSnap;   
 5     PROCESSENTRY32 stcPe32 = { 0 };  
 6     stcPe32.dwSize = sizeof(PROCESSENTRY32);
 7     char FindName[256] = {0};
 8     char ExeName[256] = {0};
 9 
10     processid = 0xffffffff;
11 
12     _tcscpy(FindName, ProcessName);
13     _tcslwr(FindName);
14 
15     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
16     if (hProcessSnap == INVALID_HANDLE_VALUE)
17         return false;
18 
19     if (!Process32First(hProcessSnap, &stcPe32))
20     {
21         CloseHandle(hProcessSnap);
22         return false;
23     }
24 
25     do 
26     {
27         _tcscpy(ExeName, stcPe32.szExeFile);
28         _tcslwr(ExeName);
29 
30         if (NULL != strstr(ExeName,FindName))
31         {
32             bExist = true; 
33             processid = stcPe32.th32ProcessID;
34             break;
35         }
36     } while (Process32Next(hProcessSnap, &stcPe32));
37 
38     CloseHandle(hProcessSnap);
39 
40     return bExist;
41 }

5、指定目录的文件和文件夹遍历

 1 void getFiles(TCHAR *Root, 
 2                      vector<CString>& vtFolderList,
 3                      vector<CString>& vtFileList)
 4 {
 5     if (_tcslen(Root) < 1) return;
 6 
 7     CString dir(Root);
 8     dir += "\\";
 9 
10     TCHAR pLogFileDirectory[1024] = { 0 };
11     _tcscpy(pLogFileDirectory, dir);
12     _tcscat(pLogFileDirectory, _T("*"));
13 
14     size_t iLen = _tcslen(pLogFileDirectory);
15     pLogFileDirectory[iLen] = 0;
16     pLogFileDirectory[iLen+1] = 0;
17 
18     WIN32_FIND_DATA findFileData;
19     HANDLE hFind = FindFirstFile(pLogFileDirectory, &findFileData);
20     if (INVALID_HANDLE_VALUE == hFind)
21     {
22         int iErrno = GetLastError();
23         return;
24     }
25 
26     BOOL bRet = FALSE;
27 
28     do
29     {
30         if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
31         {
32             if (!_tcscmp(findFileData.cFileName, _T(".")) || !_tcscmp(findFileData.cFileName, _T("..")))
33             {
34             }
35             else
36             {
37                 CString subdir  = dir + CString(findFileData.cFileName);
38                 vtFolderList.push_back(subdir);
39                 getFiles(subdir.GetBuffer(), vtFolderList, vtFileList);
40 
41             }
42         }
43         else
44         {
45 
46             CString file  = dir + CString(findFileData.cFileName);
47             CString tmpfilepath(file);
48 
49             vtFileList.push_back(file);
50         }
51 
52         bRet = FindNextFile(hFind, &findFileData);
53 
54         if (!bRet)
55             break;
56 
57 
58     }while(bRet);
59 
60     FindClose(hFind);
61 }

6、防僵死的消息处理或者防僵死等待函数

 1 //也常用名void DoEvents(DWORD millisecs)
 2 void AsyncSleep(DWORD millisecs)
 3 {
 4     DWORD start = ::GetTickCount();
 5     MSG msg;
 6 
 7     while (true)
 8     {
 9         if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
10         {
11             ::TranslateMessage(&msg);
12             ::DispatchMessage(&msg);
13         }
14         ::Sleep(15);
15         if (::GetTickCount() - start >=millisecs)
16             break;
17     }
18 }

7、全目录移动至另外一个目录

 1 static bool Comp(const CString &a, const CString &b)
 2 {
 3     return a.GetLength() < b.GetLength();
 4 }
 5 
 6 static bool Comp2(const CString &a, const CString &b)
 7 {
 8     return a.GetLength() > b.GetLength();
 9 }
10 
11 
12 extern void AsyncSleep(DWORD millisecs);
13 
14 
15 bool MoveFolderEx(CString strSource,CString strDes)
16 {
17     vector<CString> vtSrcFolderList;
18     vector<CString> vtSrcFileList;
19     vector<CString> vtSrcShortFoders;
20 
21     getFiles(strSource.GetBuffer(),vtSrcFolderList,vtSrcFileList);
22 
23     if (vtSrcFileList.size() < 1) return true;
24     int srcRootlen = strSource.GetLength();
25     for (DWORD i = 0; i < vtSrcFolderList.size(); i++)
26     {
27         CString fullpath = vtSrcFolderList[i];
28         int idx = fullpath.Find(strSource);
29         CString shortpath = fullpath.Mid(idx + srcRootlen);
30         vtSrcShortFoders.push_back(shortpath);
31     }
32 
33     std::sort(vtSrcShortFoders.begin(), vtSrcShortFoders.end(), Comp);
34 
35     ::CreateDirectory(strDes, NULL);
36     for (DWORD i = 0; i < vtSrcShortFoders.size(); i++)
37     {
38         CString foldertext = vtSrcShortFoders[i];
39         CString subfolder = strDes + foldertext;
40         ::CreateDirectory(subfolder, NULL);
41     }
42 
43     
44     BOOL bCopied = true;
45     for (DWORD i = 0; i < vtSrcFileList.size(); i++)
46     {
47         CString srcfile = vtSrcFileList[i];
48         int idx = srcfile.Find(strSource);
49         CString filetitle = srcfile.Mid(idx+srcRootlen);
50         CString desttitle = strDes + filetitle;
51         bCopied &= CopyFile(srcfile,  desttitle,  false); 
52         //每个复制成功才算全部复制成功,假如失败则重新复制一下,最多复制3次
53         int copyCnt = 0;
54         while (!bCopied && copyCnt++ < 3)
55         {
56             AsyncSleep(100);
57             bCopied = CopyFile(srcfile,  desttitle,  false); 
58         }
59         bCopied = true; //设置为true避免后面所有拷贝成功的文件也被拷贝3次
60     }
61 
62     BOOL bDeleted = true;
63     //删除掉已经拷贝完成的文件
64     for (DWORD i = 0; i < vtSrcFileList.size(); i++)
65     {
66         CString srcfile = vtSrcFileList[i];
67         bDeleted &= DeleteFile(srcfile); //只有所有全true才表示全部删除成功
68 
69         //删除失败的重试3次
70         int DeleteCnt = 0;
71         while (!bDeleted && DeleteCnt++ < 3)
72         {
73             AsyncSleep(100);
74             bDeleted = DeleteFile(srcfile); 
75         }
76         bDeleted = true;
77     }
78 
79     if (bDeleted)AsyncSleep(100);
80 
81     //排序:删除要让目录名最长的最先删除
82     std::sort(vtSrcShortFoders.begin(), vtSrcShortFoders.end(), Comp2);
83 
84     //删除掉已经拷贝完成的文件、文件夹
85     for (DWORD i = 0; i < vtSrcShortFoders.size(); i++)
86     {
87         CString foldertext = vtSrcShortFoders[i];
88         CString subfolder = strSource + foldertext;
89         ::RemoveDirectoryA(subfolder);
90     }
91     return true;
92 }

8、全目录删除包括子目录和下面的全部文件

 1 bool DeleteFolderEx(CString strSource)
 2 {
 3     vector<CString> vtSrcFolderList;
 4     vector<CString> vtSrcFileList;
 5     vector<CString> vtSrcShortFoders;
 6    
 7     getFiles(strSource.GetBuffer(),vtSrcFolderList,vtSrcFileList);
 8 
 9     if (vtSrcFileList.size() < 1) return true;
10     int srcRootlen = strSource.GetLength();
11     for (DWORD i = 0; i < vtSrcFolderList.size(); i++)
12     {
13         CString fullpath = vtSrcFolderList[i];
14         int idx = fullpath.Find(strSource);
15         CString shortpath = fullpath.Mid(idx + srcRootlen);
16         vtSrcShortFoders.push_back(shortpath);
17     }
18 
19     std::sort(vtSrcShortFoders.begin(), vtSrcShortFoders.end(), Comp);
20 
21     BOOL bDeleted = true;
22    
23     for (DWORD i = 0; i < vtSrcFileList.size(); i++)
24     {
25         CString srcfile = vtSrcFileList[i];
26         bDeleted &= DeleteFile(srcfile); //只有所有全true才表示全部删除成功
27 
28         //删除失败的重试3次
29         int DeleteCnt = 0;
30         while (!bDeleted && DeleteCnt++ < 3)
31         {
32             AsyncSleep(100);
33             bDeleted = DeleteFile(srcfile); 
34         }
35         bDeleted = true;
36     }
37 
38     if (bDeleted)AsyncSleep(100);
39 
40   
41     std::sort(vtSrcShortFoders.begin(), vtSrcShortFoders.end(), Comp2);
42 
43   
44     for (DWORD i = 0; i < vtSrcShortFoders.size(); i++)
45     {
46         CString foldertext = vtSrcShortFoders[i];
47         CString subfolder = strSource + foldertext;
48         ::RemoveDirectoryA(subfolder);
49     }
50     return true;
51 }

猜你喜欢

转载自www.cnblogs.com/peixuewen/p/12670049.html