我的DUILIB常用库

头文件:

#pragma once

//
// MyLib V1.0
// 
// 适用字符集: Unicode
//

#if USE_MFC 
	typedef CString String;
	#define MYTRACE TRACE
#else // DuiLib
	typedef CDuiString String;
	#define MYTRACE DUI__Trace 
#endif

namespace MyLib
{
	//
	// 当前应用程序路径
	extern String MODULE_PATH_WITHBS;	// 带反斜杠
	extern String MODULE_PATH_NOBS;	// 不带反斜杠
	extern std::string ANSI_MODULE_PATH_WITHBS;
	extern std::string ANSI_MODULE_PATH_NOBS;
	//
	// 初始化应用程序路径变量
	void InitModulePaths();


	//
	// 获取程序的运行完整路径
	// 参数:
	//		bBkSlash: 路径末尾是否加"\", 默认不加
	//		module: 程序模块, 默认NULL, 当前程序
	// 返回值:
	//		完整路径
	//
	String GetModulePath(BOOL bBkSlash = FALSE, HMODULE module = NULL); 

	//
	// 获取程序的运行完整路径ANSI
	// 参数:
	//		bBkSlash: 路径末尾是否加"\", 默认不加
	//		module: 程序模块, 默认NULL, 当前程序
	// 返回值:
	//		完整路径ANSI
	//
	std::string GetModulePathAnsi(BOOL bBkSlash = FALSE, HMODULE module = NULL); 

	//
	// 窗口句柄获取结构体
	typedef struct tagWNDINFO
	{
		DWORD	dwProcessId;	// 进程ID
		HWND	hWnd;			// 存放所获取的句柄	
		HWND	hParWnd;		// 父窗口句柄(获取子窗口句柄)
		int		nType;			// 获取句柄类型
		String  strClass;		// 控件类型
		String  strName;		// 控件名称
	} WNDINFO, *LPWNDINFO;
	enum 
	{
		WND_ENUM_VISIBLE = 0,			// 窗口可见
		WND_ENUM_NAME  = 1,				// 窗口名字完全匹配
		WND_ENUM_CLASS = 2,				// 窗口类型完全匹配
		WND_ENUM_NAMECLASS = 3,			// 窗口名字类型完全匹配
		WND_ENUM_NAME_LIKE = 4,			// 窗口名字部分匹配
		WND_ENUM_CLASS_LIKE = 5,		// 窗口类型部分匹配
		WND_ENUM_NAMECLASS_LIKE = 6,	// 窗口名字类型部分匹配
	};
	#define SYMBOL_NOT_FOUND (-1)

//
// 获取耗时

	//
	//	设置开始时间 
	// 
	void BeginTime();
	//
	//  设置结束时间
	void EndTime();
	//
	// 获取时间间隔
	// 返回值:
	//		
	
	enum
	{
		TIME_IN_MS,	// 毫秒
		TIME_IN_S,
	};
	DWORD GetTime(int nType = TIME_IN_MS);

	//
	// 根据程序名字获取进程ID
	// 参数:
	//		strProcess: 进程名, 如process.exe
	// 返回值:
	//		成功则返回进程ID, 失败返回-1
	//
	DWORD GetProcessIdByName(String strProcess);

	//
	// 默认窗口遍历函数
	// 参数:
	//		hWnd: EnumWindows/EnumChildWindows 所枚举得到的窗口句柄
	//		lParam: 传入的参数
	// 返回值:
	//		窗口不是所需的窗口返回TRUE, 否则返回FALSE
	//
	BOOL CALLBACK DefWndEnumProc(HWND hWnd, LPARAM lParam);

	//
	// 获取窗口句柄函数
	// 参数:
	//		pWndInfo: 窗口句柄获取结构体指针
	//		pEnumCallback: 回调函数, 默认为DefWndEnumProc
	// 返回值:
	//		成功返回对应HWND, 失败返回NULL
	//
	HWND GetProcessHwnd(LPWNDINFO pWndInfo, BOOL (CALLBACK *pEnumCallback)(HWND hWnd,LPARAM lParam) = DefWndEnumProc);

	//
	// 如果采用DuiLib, 仿MFC CFileFind的类
#if (!USE_MFC)
	class CFileFind
	{
	public:
		CFileFind() : m_hFile(INVALID_HANDLE_VALUE) {}
		BOOL FindFile(String strPath);
		BOOL FindNextFile();
		BOOL IsDirectory();
		BOOL IsDots();
		String GetFilePath();
		String GetFileName();
		void Close();
	private:
		String m_strPath;
		HANDLE m_hFile;
		WIN32_FIND_DATA m_win32FindData;
	};
#endif // !USE_MFC

	//
	// 字符转换: ANSI, UNICODE 

	//
	// UTF8的ANSI字符串转换为UNICODE字符串
	// 参数:
	//		szUtf8: ansi utf8字符串
	// 返回值:
	//		转换结果
	//
	String ANSI_to_UTF8(const char* szUtf8);

	//
	// ANSI字符串转换为GBK集UNICODE字符串
	// 参数:
	//		szAnsi: ansi字符串
	// 返回值:
	//		转换结果
	//
	String ANSI_to_GBK(const char *szAnsi);
	
	//
	// ANSI字符串转换为UNICODE字符串
	// 参数:
	//		szAnsi: ansi字符串
	// 返回值:
	//		转换后的UNICODE字符串
	//
	String ANSI_to_UNICODE(const char * szAnsi);

	//
	// UNICODE字符串转换为ANSI字符串
	// 参数:
	//		strUnicode: UNICODE字符串
	// 返回值:
	//		转换后的ansi字符串指针
	// 备注:
	//		使用后需要delete指针, 否则内存泄漏
	//
	char * UNICODE_to_ANSI(String strUnicode);

	//
	// UNICODE字符串转换为ANSI字符串
	// 参数:
	//		strUnicode: UNICODE字符串
	//		strRet: 要存储的string
	// 返回值:
	//		无,解决内存泄漏问题
	//
	void UNICODE_to_ANSI(String strUnicode, string &strRet);


	//
	// ANSI字符串转换为UTF-8 UNICODE字符串
	// 参数:
	//		szAnsi: ANSI字符串
	// 返回值:
	//		转换后的ansi字符串指针
	// 备注:
	//		使用后需要delete指针, 否则内存泄漏
	//
	String  Char_To_UTF8(const char *szAnsi);

	//
	// 执行一条DOS命令
	// 参数:
	//		strCmd: DOS命令
	// 返回值:
	//		执行成功TRUE,否则FALSE
	//
	BOOL MyCreatePipeProcess(String strCmd);

	//
	// 执行一条DOS命令并将结果保存到字符串参数中
	// 参数:
	//		strCmd: DOS命令
	//		strResult: 执行结果
	// 返回值:
	//		执行成功TRUE,否则FALSE
	//
	BOOL MyCreatePipeProcess(String strCmd, String &strResult);

	//
	// 执行一条DOS命令并将结果写入文件中
	// 参数:
	//		strCmd: DOS命令
	//		strResult: 执行结果
	// 返回值:
	//		执行成功TRUE,否则FALSE
	//
	BOOL MyCreatePipeProcessToFile(String strCmd, String strFile);

	//
	// 杀死进程
	// 参数:
	//		strExename: exe进程名
	// 返回值:
	//		无
	//
	void KillProcessByName(String strExename);

	//
	// 获取文件长度
	// 参数:
	//		strPath: 文件绝对路径
	// 返回值:
	//		文件大小(long)
	//
	long GetFileSize(String strPath);
	//
	// 去除字符串头尾的空白字符
	// 参数:
	//		str: 要去除空白字符的字符串
	// 返回值:
	//		返回去除空白字符后的字符串
	String CleanString(String str);
}; // namespace MyLib


实现文件:

#include "stdafx.h"
#include "MyLib.h"

#include <TlHelp32.h>

//
namespace MyLib
{

//
// 当前应用程序路径
String MODULE_PATH_WITHBS;	// 带反斜杠
String MODULE_PATH_NOBS;	// 不带反斜杠
std::string ANSI_MODULE_PATH_WITHBS;
std::string ANSI_MODULE_PATH_NOBS;

//
// 时间变量
SYSTEMTIME stBegin;
SYSTEMTIME stEnd;

String GetModulePath(BOOL bBkSlash /*= FALSE*/, HMODULE module /*= NULL*/)
{
	wchar_t wstrPath[MAX_PATH+1] = {0};

	DWORD dwRet = ::GetModuleFileNameW(module, wstrPath, MAX_PATH);
	ASSERT(dwRet > 0);	// 返回0代表失败

	// 返回如: E:\test\win.exe
	String strPath(wstrPath);
	int nPos = strPath.ReverseFind(TEXT('\\'));

	if (bBkSlash)
	{
		nPos += 1;
	}
	strPath = strPath.Left(nPos);

	return strPath;
}

std::string GetModulePathAnsi(BOOL bBkSlash /*= FALSE*/, HMODULE module /*= NULL*/)
{
	char strPath[MAX_PATH] = {0};
	DWORD dwRet = ::GetModuleFileNameA(module, strPath, MAX_PATH);
	
	std::string path(strPath);
	int nPos = path.find_last_of('\\');
	if (!bBkSlash)
	{
		return path.substr(0, nPos);
	}
	else
	{
		return path.substr(0, nPos+1);
	}
}

void InitModulePaths()
{
	MODULE_PATH_WITHBS = GetModulePath(TRUE);
	MODULE_PATH_NOBS = GetModulePath(FALSE);
	ANSI_MODULE_PATH_WITHBS = GetModulePathAnsi(TRUE);
	ANSI_MODULE_PATH_NOBS = GetModulePathAnsi(FALSE);
}

//
// 计算短时耗时,
void BeginTime()
{
	GetLocalTime(&stBegin);
}

void EndTime()
{
	GetLocalTime(&stEnd);
}

DWORD GetTime(int nType)
{
	DWORD nMilliSecond = 0;

	nMilliSecond += (stEnd.wHour - stBegin.wHour) * 60 * 60 * 1000;
	nMilliSecond += (stEnd.wMinute - stBegin.wMinute) * 60 * 1000;
	nMilliSecond += (stEnd.wSecond - stBegin.wSecond) * 1000;
	nMilliSecond += (stEnd.wMilliseconds - stBegin.wMilliseconds);

	if (nType == TIME_IN_S)
	{
		return (nMilliSecond / 1000);
	}
	else
	{
		return nMilliSecond;
	}
}

DWORD GetProcessIdByName(String strProcess)
{
	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); // 进程快照
	PROCESSENTRY32 pe;
	pe.dwSize = sizeof(PROCESSENTRY32); 

	if (!Process32First(hSnapShot,&pe))  
	{          
		return -1;    
	}

	while (Process32Next(hSnapShot,&pe))  
	{               
		if(!strProcess.CompareNoCase(pe.szExeFile))    
		{  
			::CloseHandle(hSnapShot);
			return pe.th32ProcessID;
		} 
	}
	::CloseHandle(hSnapShot);
	return -1;
}

BOOL CALLBACK DefWndEnumProc(HWND hWnd, LPARAM lParam)
{
	DWORD dwProcId;
	GetWindowThreadProcessId(hWnd, &dwProcId);

	LPWNDINFO pInfo = (LPWNDINFO)lParam;
	if (dwProcId == pInfo->dwProcessId)
	{
		WCHAR wstrTmp1[257] = {0};
		WCHAR wstrTmp2[257] = {0};
		
		GetClassName(hWnd, (LPWSTR)wstrTmp1, 256);
		GetWindowText(hWnd, (LPWSTR)wstrTmp2, 256);

		String strClass = wstrTmp1;
		String strName = wstrTmp2;

		switch (pInfo->nType)
		{
		case WND_ENUM_NAME:			// 名称完全匹配
			if (!strName.CompareNoCase(pInfo->strName))
			{
				pInfo->hWnd = hWnd;
				return FALSE;
			}
			break;

		case WND_ENUM_NAME_LIKE:	// 名称部分匹配
			if (strName.Find(pInfo->strName) != SYMBOL_NOT_FOUND)
			{
				pInfo->hWnd = hWnd;
				return FALSE;
			}
			break;

		case WND_ENUM_CLASS:		// 类型完全匹配
			if (!strClass.CompareNoCase(pInfo->strClass))
			{
				pInfo->hWnd = hWnd;
				return FALSE;
			}
			break;

		case WND_ENUM_CLASS_LIKE:	// 类型部分匹配
			if (strClass.Find(pInfo->strClass) != SYMBOL_NOT_FOUND)
			{
				pInfo->hWnd = hWnd;
				return FALSE;
			}
			break;

		case WND_ENUM_NAMECLASS:	// 名称类型完全匹配
			if (!strName.CompareNoCase(pInfo->strName) &&
				!strClass.CompareNoCase(pInfo->strClass))
			{
				pInfo->hWnd = hWnd;
				return FALSE;
			}
			break;

		case WND_ENUM_NAMECLASS_LIKE:	// 名称类型部分匹配
			if ((strClass.Find(pInfo->strClass) != SYMBOL_NOT_FOUND) &&
				(strName.Find(pInfo->strName) != SYMBOL_NOT_FOUND))
			{
				pInfo->hWnd = hWnd;
				return FALSE;
			}
			break;

		case WND_ENUM_VISIBLE:			// 窗口可见
			if (IsWindowVisible(hWnd))
			{
				pInfo->hWnd = hWnd;
				return FALSE;
			}
			break;
		default:
			break;
		}
	}
	return TRUE;
}


HWND GetProcessHwnd(LPWNDINFO pWndInfo, BOOL (CALLBACK *pEnumCallback)(HWND hWnd,LPARAM lParam))
{
	pWndInfo->hWnd = NULL;
	if (pWndInfo->hParWnd == NULL)		// 查找父窗口
	{
		EnumWindows(pEnumCallback, (LPARAM)pWndInfo);
	}
	else	// 查找子窗口句柄 
	{
		EnumChildWindows(pWndInfo->hParWnd, pEnumCallback, (LPARAM)pWndInfo);
	}
	return pWndInfo->hWnd;
}



//
#if (!USE_MFC)
	BOOL CFileFind::FindNextFile()
	{
		if (m_hFile == INVALID_HANDLE_VALUE)
		{
			return FALSE;
		}
		return ::FindNextFileW(m_hFile, &m_win32FindData);
	}

	BOOL CFileFind::FindFile(String strPath)
	{
		int nPos = strPath.ReverseFind(TEXT('\\'));
		m_strPath = strPath.Left(nPos+1);

		m_hFile = FindFirstFile(strPath, &m_win32FindData);

		return  (m_hFile != INVALID_HANDLE_VALUE);
	}

	BOOL CFileFind::IsDirectory()
	{
		return m_win32FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
	}

	BOOL CFileFind::IsDots()
	{
		if (m_win32FindData.cFileName[0] == TEXT('.'))
		{
			return TRUE;
		}
		return FALSE;
	}

	String CFileFind::GetFileName()
	{
		String strFilename;
		strFilename = m_win32FindData.cFileName;
		return strFilename;
	}

	String CFileFind::GetFilePath()
	{
		String strPath;
		strPath = m_strPath;
		strPath += m_win32FindData.cFileName;
		return strPath;
	}

	void CFileFind::Close()
	{
		if (m_hFile != INVALID_HANDLE_VALUE)
		{
			FindClose(m_hFile);
		}
	}
#endif // !USE_MFC 
//

//
// 字符串转换 ANSI UNICODE

	String ANSI_to_UTF8(const char* szUtf8)
	{
		int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szUtf8, strlen(szUtf8), NULL, 0);

		wchar_t* wszString = new wchar_t[wcsLen + 1];

		::MultiByteToWideChar(CP_UTF8, NULL, szUtf8, strlen(szUtf8), wszString, wcsLen);

		wszString[wcsLen] = TEXT('\0');

		CDuiString ret = wszString;
		delete wszString;

		return ret;
	}
	String ANSI_to_GBK(const char *szAnsi)
	{
		const char* s = szAnsi; 
		int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, s, strlen(s), NULL, 0);
		wchar_t* pwStr = new wchar_t[wcsLen + 1];

		::MultiByteToWideChar(CP_UTF8, NULL, s, strlen(s), pwStr, wcsLen);
		pwStr[wcsLen] = '\0';

		String strRet(pwStr);
		delete[] pwStr;

		return strRet;
	}

	String ANSI_to_UNICODE(const char * szAnsi)
	{
		//ansi 转换为UNICODE
		int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
		wchar_t * pwStr = new wchar_t[wcsLen + 1];

		::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), pwStr, wcsLen);
		pwStr[wcsLen] = '\0';

		String strRet(pwStr);
		delete []pwStr;

		return strRet;
	}

	char * UNICODE_to_ANSI(String strUnicode)
	{
		int nLen = ::WideCharToMultiByte(CP_ACP, NULL, (LPCWSTR)(strUnicode.GetData()),
							strUnicode.GetLength(), NULL, 0, NULL, NULL);

		char *szAnsi = new char [nLen + 1];

		::WideCharToMultiByte(CP_ACP,NULL, (LPCWSTR)strUnicode.GetData(),
						strUnicode.GetLength(), szAnsi, nLen, NULL, NULL);
		szAnsi[nLen] = '\0';

		return szAnsi;
	}

	void UNICODE_to_ANSI(String strUnicode, string &strRet)
	{
		char *pBuffer = UNICODE_to_ANSI(strUnicode);
		strRet = pBuffer;
		delete pBuffer;
	}

	String  Char_To_UTF8(const char *szAnsi)
	{
		int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szAnsi, strlen(szAnsi), NULL, 0);

		wchar_t* wszString = new wchar_t[wcsLen + 1];

		//转换
		::MultiByteToWideChar(CP_UTF8, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);

		//最后加上'\0'
		wszString[wcsLen] = '\0';

		int nLen = WideCharToMultiByte( CP_ACP, 0, wszString, -1, NULL, 0, NULL, NULL );
		if (nLen == 0)
		{			
			delete wszString;
			return _T("");
		}		
		String str(wszString);

		delete wszString;
		return str;
	}
//
// 创建进程 

	BOOL MyCreatePipeProcess(String strCmd)
	{
		String strRslt;
		return MyCreatePipeProcess(strCmd, strRslt);
	}

	BOOL MyCreatePipeProcessToFile(String strCmd, String strFile)
	{
		String strRslt;
		BOOL bRet = FALSE;

		bRet = MyCreatePipeProcess(strCmd, strRslt);
		if (!bRet)
		{
			return FALSE;
		}
		DeleteFile(strFile);
		
		FILE *pFile;
		_wfopen_s(&pFile, strFile, TEXT("w"));
		if (pFile == NULL)
		{
			return FALSE;
		}
		char *pBuffer = UNICODE_to_ANSI(strRslt);
		fwrite(pFile, 1, strlen(pBuffer), pFile);
		fclose(pFile);
		delete pBuffer;

		return TRUE;
	}

	BOOL MyCreatePipeProcess(String strCmd, String &strResult)
	{

		SECURITY_ATTRIBUTES sa;
		HANDLE hRead, hWrite;
		std::string result;
		sa.nLength = sizeof(SECURITY_ATTRIBUTES);
		sa.lpSecurityDescriptor = NULL;
		sa.bInheritHandle = TRUE;

		if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
			strResult = TEXT("创建管道失败!");
			return FALSE;
		}

		STARTUPINFO si = {0};
		si.cb = sizeof(si);
		si.dwFlags |= STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; // 使用默认的IO句柄

		si.hStdOutput = hWrite;
		si.hStdError = hWrite;

		si.wShowWindow = SW_HIDE;	//	显示控制台窗口  
		PROCESS_INFORMATION pi = {0};  
		MYTRACE(strCmd);
		if (!CreateProcess(NULL, (LPWSTR)strCmd.GetData(), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))  
		{  
			strResult = TEXT("创建进程失败!");
			return FALSE;
		}

		// 线程不再被访问,关闭句柄,不影响句柄运行
		CloseHandle(pi.hThread);	

		// 无限期等待线程执行完毕
		// 主线程被挂起
		WaitForSingleObject(pi.hProcess,INFINITE);

		DWORD dwExitCode;
		// 线程结束,获取返回码
		GetExitCodeProcess(pi.hProcess,
			&dwExitCode);

		// 关闭线程句柄
		CloseHandle(pi.hProcess);
		CloseHandle(hWrite);

		char buffer[257] = {0};
		DWORD dwBytesRead;
		strResult = TEXT("");
		while (ReadFile(hRead, buffer, 256, &dwBytesRead, NULL))
		{
			strResult += ANSI_to_UNICODE(buffer);
			memset(buffer, 0, 256);
		}
		MYTRACE(strResult);
		CloseHandle(hRead);

		return TRUE;
	}

	void KillProcessByName(String strExename)
	{
		String strCmd;

		strCmd = TEXT("taskkill /f /im ");
		strCmd += strExename;
		strCmd += TEXT(" /t");

		MyCreatePipeProcess(strCmd);
	}

	long GetFileSize(String strPath)
	{
		FILE *fp;
		_wfopen_s(&fp, strPath.GetData(), TEXT("rb"));
		if (fp == NULL)
		{
			return 0;
		}
		fseek(fp, 0, SEEK_END);
		long lRet = ftell(fp);
		fclose(fp);

		return lRet;
	}

	String CleanString(String str)
	{
		if (str.GetLength() < 2)
		{
			return str;
		}
		int eIndex = 0;
		TCHAR ch = 0;
		int sIndex = 0;

		for (int i = 0; i < str.GetLength(); i++)
		{
			ch = str.GetAt(i);
			if (ch > 0x20)	// 0x20: 空格符号s
			{
				sIndex = i;
				break;
			}
		}

		for (int i = str.GetLength()-1; i >= 0; i--)
		{
			ch = str.GetAt(i);
			if (ch > 0x20)
			{
				eIndex = i;
				break;
			}
		}

		if (eIndex <= sIndex)
		{
			return TEXT("XX");
		}

		str = str.Mid(sIndex, eIndex-sIndex+1);
		

		return str;
	}
}; // namespace MyLib


//


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值