个人记录常用函数总结。
环境要求window。在vs2013运行通过。
/*
常用函数总结。
环境要求window。
在vs2013运行通过。
作者:chenlin
日期:2018-09-05
*/
#include <string>
#include <string.h>
#include <vector>
#include <windows.h>
#include <TLHELP32.H>
#include "commonFunction.h"
#include <Netlistmgr.h>
#ifdef _UNICODE
#define tstring std::wstring
#else
#define tstring std::string
#endif
/*多字节转宽字节*/
std::wstring MBytesToWString(const char* lpcszString)
{
int len = strlen(lpcszString);
int unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, lpcszString, strlen(lpcszString), NULL, 0);
wchar_t* pUnicode = new wchar_t[unicodeLen + 1];
memset(pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t));
::MultiByteToWideChar(CP_ACP, 0, lpcszString, strlen(lpcszString), (LPWSTR)pUnicode, unicodeLen);
std::wstring wString = (wchar_t*)pUnicode;
delete[] pUnicode;
return wString;
}
/*宽字节转多字节*/
std::string WStringToMBytes(const wchar_t* lpwcszWString)
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = ::WideCharToMultiByte(CP_ACP, 0, lpwcszWString, wcslen(lpwcszWString), NULL, 0, NULL, NULL);
pElementText = new char[iTextLen + 1];
memset((void*)pElementText, 0, (iTextLen + 1) * sizeof(char));
::WideCharToMultiByte(CP_ACP, 0, lpwcszWString, wcslen(lpwcszWString), pElementText, iTextLen, NULL, NULL);
std::string strReturn(pElementText);
delete[] pElementText;
return strReturn;
}
//utf8 转unicode
std::wstring Utf82Unicode(const std::string& utf8string)
{
int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0);
if (widesize == ERROR_NO_UNICODE_TRANSLATION)
{
throw std::exception("Invalid UTF-8 sequence.");
}
if (widesize == 0)
{
throw std::exception("Error in conversion.");
}
std::vector<wchar_t> resultstring(widesize);
int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize);
if (convresult != widesize)
{
throw std::exception("La falla!");
}
return std::wstring(&resultstring[0]);
}
//utf-8 转 ascii
std::string UTF_82ASCII(std::string& strUtf8Code)
{
//先把 utf8 转为 unicode
std::wstring wstr = Utf82Unicode(strUtf8Code);
//最后把 unicode 转为 ascii
std::string strRet = WStringToMBytes(wstr.c_str());
return strRet;
}
//查找进程:成功返回进程id
DWORD GetProcessidFromName(LPCTSTR name)
{
PROCESSENTRY32 pe;
DWORD id = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hSnapshot, &pe))
return 0;
while (1)
{
pe.dwSize = sizeof(PROCESSENTRY32);
if (Process32Next(hSnapshot, &pe) == FALSE)
break;
if (wcscmp(pe.szExeFile, name) == 0)
{
id = pe.th32ProcessID;
break;
}
}
CloseHandle(hSnapshot);
return id;
}
//根据进程名称关闭进程,找到进程并且关闭返回true
BOOL closeProcessFromName(LPCTSTR strProcessName, DWORD dwTH32ProcessID)
{
BOOL bResult = FALSE;
if (NULL == strProcessName)
{
return FALSE;
}
do
{
if (NULL != dwTH32ProcessID)//如果已经知道进程ID,直接结束进程
{
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwTH32ProcessID);
bResult = TerminateProcess(hProcess, 0);
break;
}
HANDLE handle32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == handle32Snapshot)
{
break;
}
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof(PROCESSENTRY32);
//Search for all the process and terminate it
if (Process32First(handle32Snapshot, &pEntry))
{
BOOL bFound = FALSE;
if (!wcscmp(pEntry.szExeFile, strProcessName))
{
bFound = TRUE;
}
while ((!bFound) && Process32Next(handle32Snapshot, &pEntry))
{
if (!wcscmp(pEntry.szExeFile, strProcessName))
{
bFound = TRUE;
}
}
if (bFound)
{
CloseHandle(handle32Snapshot);
HANDLE handLe = OpenProcess(PROCESS_TERMINATE, FALSE, pEntry.th32ProcessID);
bResult = TerminateProcess(handLe, 0); //结束进程
break;
}
}
CloseHandle(handle32Snapshot);
} while (0);
Sleep(500);
return bResult;
}
//获取应用程序目录
std::wstring getAppDir()
{
TCHAR szBuf[MAX_PATH] = {0};
GetModuleFileName(NULL, (LPTSTR)szBuf, MAX_PATH);
*(strrchr(szBuf, '\\') + sizeof(TCHAR)) = 0;
std::wstring strFileName = szBuf;
rn strFileName;
}
tstring getAppName()
{
TCHAR szBuf[MAX_PATH] = { 0 }, szBuf2[MAX_PATH] = { 0 };
GetModuleFileName(NULL, (LPTSTR)szBuf, MAX_PATH);
#ifdef _UNICODE
wcscpy_s(szBuf2, (wcsrchr(szBuf, _T('\\')) + sizeof(TCHAR)) );
#else
strcpy_s(szBuf2, (strrchr(szBuf, '\\') + sizeof(TCHAR)) );
#endif
tstring strFileName = szBuf2;
return strFileName;
}
//检测网络连接// 返回 true代表连接正常
bool checkIsNetwork()
{
CoInitialize(NULL); // 通过NLA接口获取网络状态
IUnknown *pUnknown = NULL;
bool bOnline = false;//是否在线
HRESULT Result = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_IUnknown, (void **)&pUnknown);
if (SUCCEEDED(Result))
{
INetworkListManager *pNetworkListManager = NULL;
if (pUnknown)
Result = pUnknown->QueryInterface(IID_INetworkListManager, (void **)&pNetworkListManager);
if (SUCCEEDED(Result))
{
VARIANT_BOOL IsConnect = VARIANT_FALSE;
if (pNetworkListManager)
Result = pNetworkListManager->get_IsConnectedToInternet(&IsConnect);
if (SUCCEEDED(Result))
{
bOnline = (IsConnect == VARIANT_TRUE) ? true : false;
}
}
if (pNetworkListManager)
pNetworkListManager->Release();
}
if (pUnknown)
pUnknown->Release();
CoUninitialize();
return bOnline;
}