|
@@ -0,0 +1,537 @@
|
|
|
+#include "stdafx.h"
|
|
|
+#include "Global.h"
|
|
|
+#include <SetupAPI.h>
|
|
|
+#include <InitGuid.h>
|
|
|
+#include <WinIoCtl.h>
|
|
|
+#include <direct.h>
|
|
|
+#pragma comment(lib, "SetupAPI.lib")
|
|
|
+
|
|
|
+namespace Global
|
|
|
+{
|
|
|
+ //////////////////////////////////////////////////////////////////////////
|
|
|
+ // 全局变量;
|
|
|
+ TCHAR g_szCurModuleDir[MAX_PATH] = { 0 };
|
|
|
+ TCHAR g_szCurModulePath[MAX_PATH] = { 0 };
|
|
|
+ TCHAR g_szFna[MAX_PATH] = { 0 };
|
|
|
+ TCHAR g_szConfig[MAX_PATH] = { 0 };
|
|
|
+ TCHAR g_szLogPath[MAX_PATH] = { 0 };
|
|
|
+ bool g_bEnableLog = false;
|
|
|
+ time_t g_time = time(NULL);
|
|
|
+
|
|
|
+ //////////////////////////////////////////////////////////////////////////
|
|
|
+ void MKDIR(LPCTSTR dir)
|
|
|
+ {
|
|
|
+ //////////////////////////////////////////////////////////////////////////
|
|
|
+ // 创建目录;
|
|
|
+ int nleft = 0;
|
|
|
+ int nIndex = -1;
|
|
|
+ string strdir = dir;
|
|
|
+ strdir = strdir.substr(0, strdir.find_last_of(_T("\\")));
|
|
|
+
|
|
|
+ if (strdir.at(strdir.size() - 1) != _T('\\'))
|
|
|
+ strdir.append(_T("\\"));
|
|
|
+
|
|
|
+ // 共享路径和硬盘盘符;
|
|
|
+ if (_tcscmp(strdir.substr(0, 2).c_str(), _T("\\\\")) == 0)
|
|
|
+ nleft = strdir.find_first_of(_T("\\"), 2) + 1; // 去除共享主机名;
|
|
|
+ else if (strdir.at(2) == _T('\\'))
|
|
|
+ nleft = 3;
|
|
|
+
|
|
|
+ do
|
|
|
+ {
|
|
|
+ nIndex = strdir.substr(nleft, -1).find_first_of(_T("\\"));
|
|
|
+
|
|
|
+ if (nIndex != string::npos)
|
|
|
+ {
|
|
|
+ if (_mkdir(strdir.substr(0, nIndex + nleft).c_str()) == -1 && (errno != EEXIST))
|
|
|
+ {
|
|
|
+ //WriteTextLog(_T("创建目录失败:%s,错误码:%d"), strdir.substr(0, nIndex + nleft).c_str(), errno);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ nleft += nIndex + 1;
|
|
|
+ }
|
|
|
+ } while (nIndex != -1);
|
|
|
+ };
|
|
|
+
|
|
|
+ // 全局函数;
|
|
|
+ /************************************************************************/
|
|
|
+ /* 函数:WriteTextLog[7/28/2009 Jeff];
|
|
|
+ /* 描述:写文本日志;
|
|
|
+ /* 参数:;
|
|
|
+ /* [IN] :;
|
|
|
+ /* 返回:void;
|
|
|
+ /* 注意:;
|
|
|
+ /* 示例:;
|
|
|
+ /*
|
|
|
+ /* 修改:;
|
|
|
+ /* 日期:;
|
|
|
+ /* 内容:;
|
|
|
+ /************************************************************************/
|
|
|
+ void WriteTextLog(const TCHAR* format, ...)
|
|
|
+ {
|
|
|
+ // 将日志内容输入到文件中;
|
|
|
+ // 获取今年年份;
|
|
|
+ __time64_t gmt = time(NULL); // 获取当前日历时间(1900-01-01开始的Unix时间戳);
|
|
|
+ struct tm gmtm = { 0 };
|
|
|
+ localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
|
|
|
+
|
|
|
+ // 解析出日志路径;
|
|
|
+ TCHAR szlogpath[MAX_PATH] = { 0 };
|
|
|
+ _stprintf_s(szlogpath, _T("%slog %02d%02d.txt"), g_szCurModuleDir, gmtm.tm_mon + 1, gmtm.tm_mday);
|
|
|
+ // 打开或创建文件;
|
|
|
+ FILE* fp = NULL;
|
|
|
+ MKDIR(szlogpath);
|
|
|
+ //if (_taccess(szlogpath, 0) != -1)
|
|
|
+#ifndef UNICODE
|
|
|
+ if (_access(szlogpath, 0) != -1)
|
|
|
+#else
|
|
|
+ if (_taccess(szlogpath, 0) != -1)
|
|
|
+#endif
|
|
|
+ { // 存在;
|
|
|
+ if (0 == _tfopen_s(&fp, szlogpath, _T("a+")))
|
|
|
+ // 移动到末尾;
|
|
|
+ fseek(fp, 0, SEEK_END);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ { // 不存在;
|
|
|
+ _tfopen_s(&fp, szlogpath, _T("w+"));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fp == NULL)
|
|
|
+ return;
|
|
|
+
|
|
|
+ // 格式化前设置语言区域;
|
|
|
+ TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
|
|
|
+ _tsetlocale(LC_CTYPE, _T("chs")); //设定中文;
|
|
|
+
|
|
|
+ // 格式化日志内容;
|
|
|
+ va_list args = NULL;
|
|
|
+ int len = 0;
|
|
|
+ TCHAR* buffer = NULL;
|
|
|
+ va_start(args, format);
|
|
|
+ // _vscprintf doesn't count. terminating '\0'
|
|
|
+ len = _vsctprintf(format, args) + 1;
|
|
|
+ buffer = (TCHAR*)malloc(len * sizeof(TCHAR));
|
|
|
+ _vstprintf_s(buffer, len, format, args);
|
|
|
+ _ftprintf(fp, _T("%04d-%02d-%02d %02d:%02d:%02d %s\n"), gmtm.tm_year + 1990, gmtm.tm_mon + 1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec, buffer);
|
|
|
+
|
|
|
+ // 关闭文件,释放资源并设置回原语言区域;
|
|
|
+ free(buffer);
|
|
|
+ fclose(fp);
|
|
|
+ _tsetlocale(LC_CTYPE, old_locale);
|
|
|
+ free(old_locale); //还原区域设定;
|
|
|
+ }
|
|
|
+
|
|
|
+ void WritePythonLog(const TCHAR* format, ...)
|
|
|
+ {
|
|
|
+ // 将日志内容输入到文件中;
|
|
|
+ // 获取今年年份;
|
|
|
+ __time64_t gmt = time(NULL); // 获取当前日历时间(1900-01-01开始的Unix时间戳);
|
|
|
+ struct tm gmtm = { 0 };
|
|
|
+ localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
|
|
|
+
|
|
|
+ // 解析出日志路径;
|
|
|
+ //TCHAR szlogpath[MAX_PATH] = { 0 };
|
|
|
+ //_stprintf_s(szlogpath, _T("%slog\\Serial Port Log %02d%02d.txt"), g_szCurModuleDir, gmtm.tm_mon + 1, gmtm.tm_mday);
|
|
|
+ // 打开或创建文件;
|
|
|
+ FILE* fp = NULL;
|
|
|
+ MKDIR(g_szLogPath);
|
|
|
+ //if (_taccess(szlogpath, 0) != -1)
|
|
|
+#ifndef UNICODE
|
|
|
+ if (_access(g_szLogPath, 0) != -1)
|
|
|
+#else
|
|
|
+ if (_taccess(g_szLogPath, 0) != -1)
|
|
|
+#endif
|
|
|
+ { // 存在;
|
|
|
+ if (0 == _tfopen_s(&fp, g_szLogPath, _T("a+")))
|
|
|
+ // 移动到末尾;
|
|
|
+ fseek(fp, 0, SEEK_END);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ { // 不存在;
|
|
|
+ _tfopen_s(&fp, g_szLogPath, _T("w+"));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fp == NULL)
|
|
|
+ return;
|
|
|
+
|
|
|
+ // 格式化前设置语言区域;
|
|
|
+ TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
|
|
|
+ _tsetlocale(LC_CTYPE, _T("chs")); //设定中文;
|
|
|
+
|
|
|
+ // 格式化日志内容;
|
|
|
+ va_list args = NULL;
|
|
|
+ int len = 0;
|
|
|
+ TCHAR* buffer = NULL;
|
|
|
+ va_start(args, format);
|
|
|
+ // _vscprintf doesn't count. terminating '\0'
|
|
|
+ len = _vsctprintf(format, args) + 1;
|
|
|
+ buffer = (TCHAR*)malloc(len * sizeof(TCHAR));
|
|
|
+ _vstprintf_s(buffer, len, format, args);
|
|
|
+ _ftprintf(fp, _T("%04d-%02d-%02d %02d:%02d:%02d %s\n"), gmtm.tm_year + 1990, gmtm.tm_mon + 1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec, buffer);
|
|
|
+
|
|
|
+ // 关闭文件,释放资源并设置回原语言区域;
|
|
|
+ free(buffer);
|
|
|
+ fclose(fp);
|
|
|
+ _tsetlocale(LC_CTYPE, old_locale);
|
|
|
+ free(old_locale); //还原区域设定;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 去除空格;
|
|
|
+ std::string& trim(std::string& str)
|
|
|
+ {
|
|
|
+ int nIndex = 0;
|
|
|
+ while ((nIndex = str.find_first_of(' ')) != std::string::npos)
|
|
|
+ str.erase(nIndex, 1);
|
|
|
+
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+
|
|
|
+ void Init()
|
|
|
+ {
|
|
|
+ TCHAR szDrive[_MAX_DRIVE] = { 0 };
|
|
|
+ TCHAR szDir[_MAX_DIR] = { 0 };
|
|
|
+ TCHAR szExt[_MAX_DIR] = { 0 };
|
|
|
+ ::GetModuleFileName(NULL, g_szCurModulePath, sizeof(g_szCurModulePath) / sizeof(TCHAR));
|
|
|
+ _tsplitpath_s(g_szCurModulePath, szDrive, szDir, g_szFna, szExt);
|
|
|
+ _tcscpy_s(g_szCurModuleDir, szDrive);
|
|
|
+ _tcscat_s(g_szCurModuleDir, szDir);
|
|
|
+ SetCurrentDirectory(g_szCurModulePath);
|
|
|
+ }
|
|
|
+
|
|
|
+ // hModule 模块句柄 NULL表示当前模块;
|
|
|
+ bool GetVersion(IN const TCHAR* fname, OUT WORD* pdwFileVersion, OUT WORD* pdwProductVerion)
|
|
|
+ {
|
|
|
+ VS_FIXEDFILEINFO* pVi = NULL;
|
|
|
+ DWORD dwHandle = 0;
|
|
|
+ int size = GetFileVersionInfoSize(fname, &dwHandle);
|
|
|
+ if (size > 0)
|
|
|
+ {
|
|
|
+ BYTE* buffer = new BYTE[size];
|
|
|
+ memset(buffer, 0, size);
|
|
|
+
|
|
|
+ if (GetFileVersionInfo(fname, 0, size, buffer))
|
|
|
+ {
|
|
|
+ if (VerQueryValue(buffer, _T("\\"), (LPVOID*)& pVi, (PUINT)& size))
|
|
|
+ {
|
|
|
+ pdwFileVersion[0] = HIWORD(pVi->dwFileVersionMS);
|
|
|
+ pdwFileVersion[1] = LOWORD(pVi->dwFileVersionMS);
|
|
|
+ pdwFileVersion[2] = HIWORD(pVi->dwFileVersionLS);
|
|
|
+ pdwFileVersion[3] = LOWORD(pVi->dwFileVersionLS);
|
|
|
+
|
|
|
+ pdwProductVerion[0] = HIWORD(pVi->dwProductVersionMS);
|
|
|
+ pdwProductVerion[1] = LOWORD(pVi->dwProductVersionMS);
|
|
|
+ pdwProductVerion[2] = HIWORD(pVi->dwProductVersionLS);
|
|
|
+ pdwProductVerion[3] = LOWORD(pVi->dwProductVersionLS);
|
|
|
+
|
|
|
+ delete[] buffer;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ delete[] buffer;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ BOOL GetVersion(IN HMODULE hModule, OUT DWORD(&dwFVArray)[4], OUT DWORD(&dwPVArray)[4])
|
|
|
+ {
|
|
|
+ TCHAR fname[MAX_PATH];
|
|
|
+ VS_FIXEDFILEINFO* pVi;
|
|
|
+ DWORD dwHandle;
|
|
|
+
|
|
|
+ if (GetModuleFileName(hModule, fname, MAX_PATH))
|
|
|
+ {
|
|
|
+ INT nSize = GetFileVersionInfoSize(fname, &dwHandle);
|
|
|
+
|
|
|
+ if (nSize > 0)
|
|
|
+ {
|
|
|
+ BYTE* pBuffer = new BYTE[nSize];
|
|
|
+ memset(pBuffer, 0, nSize);
|
|
|
+
|
|
|
+ if (GetFileVersionInfo(fname, 0, nSize, pBuffer))
|
|
|
+ {
|
|
|
+ if (VerQueryValue(pBuffer, _T("\\"), (LPVOID*)& pVi, (PUINT)& nSize))
|
|
|
+ {
|
|
|
+ dwFVArray[0] = HIWORD(pVi->dwFileVersionMS);
|
|
|
+ dwFVArray[1] = LOWORD(pVi->dwFileVersionMS);
|
|
|
+ dwFVArray[2] = HIWORD(pVi->dwFileVersionLS);
|
|
|
+ dwFVArray[3] = LOWORD(pVi->dwFileVersionLS);
|
|
|
+
|
|
|
+ dwPVArray[0] = HIWORD(pVi->dwProductVersionMS);
|
|
|
+ dwPVArray[1] = LOWORD(pVi->dwProductVersionMS);
|
|
|
+ dwPVArray[2] = HIWORD(pVi->dwProductVersionLS);
|
|
|
+ dwPVArray[3] = LOWORD(pVi->dwProductVersionLS);
|
|
|
+
|
|
|
+ delete[]pBuffer;
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pBuffer)
|
|
|
+ delete[]pBuffer;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ WCHAR* ASCII2UNICODE(IN LPCCH lpASCIIStr)
|
|
|
+ {
|
|
|
+ if (lpASCIIStr == NULL)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ // 获取宽字符字节数;
|
|
|
+ int cchWideChar = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, NULL, 0);
|
|
|
+ if (cchWideChar == 0)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ // 转换成宽字符串;
|
|
|
+ WCHAR* pWideChar = new WCHAR[cchWideChar + 1];
|
|
|
+ memset(pWideChar, 0, sizeof(WCHAR) * (cchWideChar + 1));
|
|
|
+ int nWriteNum = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, pWideChar, cchWideChar);
|
|
|
+ if (nWriteNum != cchWideChar)
|
|
|
+ {
|
|
|
+ if (pWideChar)
|
|
|
+ delete[] pWideChar;
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return pWideChar;
|
|
|
+ }
|
|
|
+
|
|
|
+ BOOL UNICODE2UTF8(IN LPWCH lpUNICODEStr, OUT string& strResult)
|
|
|
+ {
|
|
|
+ if (lpUNICODEStr == NULL)
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ // 获取多字节字符字节数;
|
|
|
+ int cbMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
|
|
|
+ if (cbMultiByte == 0)
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ // 转换成多字节字符;
|
|
|
+ CHAR* pResult = new CHAR[cbMultiByte];
|
|
|
+ memset(pResult, 0, cbMultiByte);
|
|
|
+ int nWriteNum = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, pResult, cbMultiByte, NULL, NULL);
|
|
|
+ if (nWriteNum != cbMultiByte)
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ strResult = pResult;
|
|
|
+ if (pResult)
|
|
|
+ delete[] pResult;
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ BOOL ASCII2UTF8(IN LPCCH lpASCIIStr, OUT string& strResult)
|
|
|
+ {
|
|
|
+ // 将ASCII字符串转成UNICODE字符串;
|
|
|
+ WCHAR* pWideChar = ASCII2UNICODE(lpASCIIStr);
|
|
|
+ if (pWideChar == NULL)
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ // 再将UICODE转成UTF8;
|
|
|
+ BOOL bResult = UNICODE2UTF8(pWideChar, strResult);
|
|
|
+
|
|
|
+ if (pWideChar)
|
|
|
+ delete[] pWideChar;
|
|
|
+
|
|
|
+ return bResult;
|
|
|
+ }
|
|
|
+
|
|
|
+ string EnCode_UTF8URL(IN const CHAR* pText)
|
|
|
+ {
|
|
|
+ string tt = "";
|
|
|
+ string dd = "";
|
|
|
+ ASCII2UTF8(pText, tt);
|
|
|
+
|
|
|
+ size_t len = tt.length();
|
|
|
+ for (size_t i = 0; i < len; i++)
|
|
|
+ {
|
|
|
+ if (isalnum((BYTE)tt.at(i)))
|
|
|
+ {
|
|
|
+ char tempbuff[2] = { 0 };
|
|
|
+ sprintf_s(tempbuff, "%c", (BYTE)tt.at(i));
|
|
|
+ dd.append(tempbuff);
|
|
|
+ }
|
|
|
+ else if (isspace((BYTE)tt.at(i)))
|
|
|
+ {
|
|
|
+ dd.append("+");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ char tempbuff[4];
|
|
|
+ sprintf_s(tempbuff, "%%%X%X", ((BYTE)tt.at(i)) >> 4, ((BYTE)tt.at(i)) % 16);
|
|
|
+ dd.append(tempbuff);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return dd;
|
|
|
+ }
|
|
|
+
|
|
|
+ void EnCode_UTF8URL(IN const CHAR* pText, OUT string& strResult)
|
|
|
+ {
|
|
|
+ string tt = "";
|
|
|
+ ASCII2UTF8(pText, tt);
|
|
|
+
|
|
|
+ size_t len = tt.length();
|
|
|
+ for (size_t i = 0; i < len; i++)
|
|
|
+ {
|
|
|
+ if (isalnum((BYTE)tt.at(i)))
|
|
|
+ {
|
|
|
+ char tempbuff[2] = { 0 };
|
|
|
+ sprintf_s(tempbuff, "%c", (BYTE)tt.at(i));
|
|
|
+ strResult.append(tempbuff);
|
|
|
+ }
|
|
|
+ else if (isspace((BYTE)tt.at(i)))
|
|
|
+ {
|
|
|
+ strResult.append("+");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ char tempbuff[4];
|
|
|
+ sprintf_s(tempbuff, "%%%X%X", ((BYTE)tt.at(i)) >> 4, ((BYTE)tt.at(i)) % 16);
|
|
|
+ strResult.append(tempbuff);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //做为解Url使用
|
|
|
+ char CharToInt(char ch)
|
|
|
+ {
|
|
|
+ if (ch >= '0' && ch <= '9')return (char)(ch - '0');
|
|
|
+ if (ch >= 'a' && ch <= 'f')return (char)(ch - 'a' + 10);
|
|
|
+ if (ch >= 'A' && ch <= 'F')return (char)(ch - 'A' + 10);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ char StrToBin(IN char(&str)[2])
|
|
|
+ {
|
|
|
+ char tempWord[2];
|
|
|
+ char chn;
|
|
|
+
|
|
|
+ tempWord[0] = CharToInt(str[0]); //make the B to 11 -- 00001011
|
|
|
+ tempWord[1] = CharToInt(str[1]); //make the 0 to 0 -- 00000000
|
|
|
+
|
|
|
+ chn = (tempWord[0] << 4) | tempWord[1]; //to change the BO to 10110000
|
|
|
+
|
|
|
+ return chn;
|
|
|
+ }
|
|
|
+
|
|
|
+ CHAR* UNICODE2ASCII(IN LPWCH lpUNICODEStr)
|
|
|
+ {
|
|
|
+ if (lpUNICODEStr == NULL)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ // 获取多字节字符字节数;
|
|
|
+ int cbMultiByte = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
|
|
|
+ if (cbMultiByte == 0)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ // 转换成多字节字符;
|
|
|
+ CHAR *pMultiByteStr = new CHAR[cbMultiByte + 1];
|
|
|
+ memset(pMultiByteStr, 0, cbMultiByte + 1);
|
|
|
+ int nWriteNum = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, pMultiByteStr, cbMultiByte, NULL, NULL);
|
|
|
+ if (nWriteNum != cbMultiByte)
|
|
|
+ {
|
|
|
+ if (pMultiByteStr)
|
|
|
+ delete[]pMultiByteStr;
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ pMultiByteStr[cbMultiByte] = '\0';
|
|
|
+
|
|
|
+ return pMultiByteStr;
|
|
|
+ }
|
|
|
+
|
|
|
+ BOOL UNICODE2ASCII(IN LPWCH lpUNICODEStr, OUT LPCH pASCIIStr, IN CONST INT& nASCIIStrLen)
|
|
|
+ {
|
|
|
+ if (lpUNICODEStr == NULL)
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ // 获取多字节字符字节数;
|
|
|
+ int cbMultiByte = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
|
|
|
+ if (cbMultiByte == 0 || cbMultiByte >= nASCIIStrLen)
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ // 转换成多字节字符;
|
|
|
+ memset((void*)pASCIIStr, 0, nASCIIStrLen);
|
|
|
+ int nWriteNum = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, pASCIIStr, cbMultiByte, NULL, NULL);
|
|
|
+ if (nWriteNum != cbMultiByte)
|
|
|
+ {
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ /************************************************************************/
|
|
|
+ /* 函数:[7/26/2016 IT];
|
|
|
+ /* 描述:;
|
|
|
+ /* 参数:;
|
|
|
+ /* [IN] :;
|
|
|
+ /* [OUT] :;
|
|
|
+ /* [IN/OUT] :;
|
|
|
+ /* 返回:void;
|
|
|
+ /* 注意:;
|
|
|
+ /* 示例:;
|
|
|
+ /*
|
|
|
+ /* 修改:;
|
|
|
+ /* 日期:;
|
|
|
+ /* 内容:;
|
|
|
+ /************************************************************************/
|
|
|
+ string DeCode_URLUNICODE(IN const CHAR* pURLText)
|
|
|
+ {
|
|
|
+ string str = pURLText;
|
|
|
+ string strResult = "";
|
|
|
+
|
|
|
+ INT nIndex = 0;
|
|
|
+ string strTemp = "";
|
|
|
+
|
|
|
+ while (str.find("\\u", 0, 2) != string::npos)
|
|
|
+ {
|
|
|
+ nIndex = str.find("\\u", 0, 2);
|
|
|
+ strResult.append(str.substr(0, nIndex));
|
|
|
+ strTemp = str.substr(nIndex + 2, 4);
|
|
|
+ str = str.substr(nIndex + 2 + 4);
|
|
|
+ CHAR szReturn[10] = { 0 };
|
|
|
+
|
|
|
+ union __UNION_VAR_INT {
|
|
|
+ BYTE ch[2];
|
|
|
+ int value;
|
|
|
+ }unionVarInt;
|
|
|
+
|
|
|
+ unionVarInt.ch[0] = (CharToInt(strTemp.at(2)) << 4) | (CharToInt(strTemp.at(3)) & 0x00FF);
|
|
|
+ unionVarInt.ch[1] = (CharToInt(strTemp.at(0)) << 4) | (CharToInt(strTemp.at(1)) & 0x00FF);
|
|
|
+
|
|
|
+ WCHAR szWide[2] = { 0 };
|
|
|
+ szWide[0] = unionVarInt.value;
|
|
|
+ UNICODE2ASCII(szWide, szReturn, 10);
|
|
|
+ strResult.append(szReturn);
|
|
|
+ }
|
|
|
+ strResult.append(str);
|
|
|
+
|
|
|
+ return strResult;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 通过注册表查找系统当前串口信息;
|
|
|
+
|
|
|
+ BOOL IsValidString(LPCTSTR lpszString)
|
|
|
+ {
|
|
|
+ if (lpszString == NULL)
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ do
|
|
|
+ {
|
|
|
+ // ASCII可显示的字符;
|
|
|
+ if (*lpszString < 32 || *lpszString > 126)
|
|
|
+ {
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+ } while (*++lpszString);
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+} // namespace Global
|