Browse Source

添加对curl库的封装类。

Jeff 6 years ago
parent
commit
92406cf9fd

+ 739 - 0
source/hook/WeChats/CharEncoding.cpp

@@ -0,0 +1,739 @@
+#include "StdAfx.h"
+#include "CharEncoding.h"
+
+WCHAR* CharEncoding::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 CharEncoding::ASCII2UNICODE(IN LPCCH lpASCIIStr, OUT PWCH pUNICODEStr, IN CONST INT& nUNICODEStrLen)
+{
+	if ( lpASCIIStr == NULL )
+		return FALSE;
+
+	// 获取宽字符字节数;
+	int cchWideChar  = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, NULL, 0);
+	if ( cchWideChar == 0 || cchWideChar >= nUNICODEStrLen)
+		return FALSE;
+
+	// 转换成宽字符串;
+	memset(pUNICODEStr, 0 , sizeof(WCHAR)*nUNICODEStrLen);
+	int nWriteNum = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, pUNICODEStr, cchWideChar );
+	if ( nWriteNum != cchWideChar)
+		return FALSE;
+
+	return TRUE;
+}
+
+BOOL CharEncoding::ASCII2UNICODE(IN LPCCH lpASCIIStr, OUT wstring &strResult)
+{
+	if ( lpASCIIStr == NULL )
+		return FALSE;
+
+	// 获取宽字符字节数;
+	int cchWideChar  = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, NULL, 0);
+	if ( cchWideChar == 0 )
+		return FALSE;
+
+	// 转换成宽字符串;
+	WCHAR *pResult = new WCHAR[cchWideChar];
+	memset(pResult, 0 , sizeof(WCHAR)*cchWideChar);
+	int nWriteNum = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, pResult, cchWideChar );
+	if ( nWriteNum != cchWideChar)
+		return FALSE;
+
+	strResult = pResult;
+	if ( pResult )
+		delete[] pResult;
+
+	return TRUE;
+}
+
+CHAR* CharEncoding::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;
+	}
+
+	return pMultiByteStr;
+}
+
+BOOL CharEncoding::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;
+}
+
+BOOL CharEncoding::UNICODE2ASCII(IN LPWCH lpUNICODEStr, OUT string &strResult)
+{
+	if ( lpUNICODEStr == NULL )
+		return FALSE;
+
+	// 获取多字节字符字节数;
+	int cbMultiByte = WideCharToMultiByte(CP_OEMCP, 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_OEMCP, 0, lpUNICODEStr, -1, pResult, cbMultiByte, NULL, NULL);
+	if (nWriteNum != cbMultiByte)
+		return FALSE;
+
+	strResult = pResult;
+	if ( pResult )
+		delete[] pResult;
+
+	return TRUE;
+}
+
+CHAR* CharEncoding::UNICODE2UTF8(IN LPWCH lpUNICODEStr)
+{
+	if ( lpUNICODEStr == NULL )
+		return NULL;
+
+	// 获取多字节字符字节数;
+	int cbMultiByte = WideCharToMultiByte(CP_UTF8, 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_UTF8, 0, lpUNICODEStr, -1, pMultiByteStr, cbMultiByte, NULL, NULL);
+	if (nWriteNum != cbMultiByte)
+	{
+		if (pMultiByteStr) 
+			delete []pMultiByteStr;
+		return NULL;
+	}
+
+	return pMultiByteStr;
+}
+
+BOOL CharEncoding::UNICODE2UTF8(IN LPWCH lpUNICODEStr, OUT LPCH pUTF8Str, IN CONST INT& nUTF8StrLen)
+{
+	if ( lpUNICODEStr == NULL )
+		return FALSE;
+
+	// 获取多字节字符字节数;
+	int cbMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
+	if ( cbMultiByte == 0 || cbMultiByte >= nUTF8StrLen )
+		return FALSE;
+
+	// 转换成多字节字符;
+	memset(pUTF8Str, 0, nUTF8StrLen);
+	int nWriteNum = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, pUTF8Str, cbMultiByte, NULL, NULL);
+	if (nWriteNum != cbMultiByte)
+	{
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+BOOL CharEncoding::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;
+}
+
+CHAR* CharEncoding::ASCII2UTF8(IN LPCCH lpASCIIStr)
+{
+	// 将ASCII字符串转成UNICODE字符串;
+	WCHAR* pWideChar = ASCII2UNICODE(lpASCIIStr);
+	if ( pWideChar == NULL )
+		return NULL;
+
+	// 再将UICODE转成UTF8;
+	CHAR* pUTF8 = UNICODE2UTF8(pWideChar);
+	if ( pWideChar )
+		delete []pWideChar;
+
+	return pUTF8;
+}
+
+BOOL CharEncoding::ASCII2UTF8(IN LPCCH lpASCIIStr, OUT LPCH pUTF8Str, IN CONST INT& nUTF8StrLen)
+{
+	// 将ASCII字符串转成UNICODE字符串;
+	WCHAR* pWideChar = ASCII2UNICODE(lpASCIIStr);
+	if ( pWideChar == NULL )
+		return FALSE;
+
+	// 再将UICODE转成UTF8;
+	BOOL bResult = UNICODE2UTF8(pWideChar, pUTF8Str, nUTF8StrLen);
+
+	if ( pWideChar )
+		delete []pWideChar;
+
+	return bResult;
+}
+
+BOOL CharEncoding::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;
+}
+
+WCHAR* CharEncoding::UTF82UNICODE(IN LPCCH lpUTF8)
+{
+	if ( lpUTF8 == NULL )
+		return NULL;
+
+	// 获取unicode字符数;
+	int cchWideChar = MultiByteToWideChar(CP_UTF8, 0, lpUTF8, -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_UTF8, 0, lpUTF8, -1, pWideChar, cchWideChar );
+	if ( nWriteNum != cchWideChar)
+	{ 
+		if (pWideChar) 
+			delete []pWideChar;
+		return NULL;
+	}
+
+	return pWideChar;
+}
+
+BOOL CharEncoding::UTF82UNICODE(IN LPCCH lpUTF8, OUT PWCH pUNICODEStr, IN CONST INT& nUNICODEStrLen)
+{
+	if ( lpUTF8 == NULL )
+		return FALSE;
+
+	// 获取宽字符字节数;
+	int cchWideChar  = MultiByteToWideChar(CP_UTF8, 0, lpUTF8, -1, NULL, 0);
+	if ( cchWideChar == 0 || cchWideChar >= nUNICODEStrLen)
+		return FALSE;
+
+	// 转换成宽字符串;
+	memset(pUNICODEStr, 0 , sizeof(WCHAR)*nUNICODEStrLen);
+	int nWriteNum = MultiByteToWideChar(CP_UTF8, 0, lpUTF8, -1, pUNICODEStr, cchWideChar );
+	if ( nWriteNum != cchWideChar)
+		return FALSE;
+
+	return TRUE;
+}
+
+BOOL CharEncoding::UTF82UNICODE(IN LPCCH lpUTF8, OUT wstring &strResult)
+{
+	if ( lpUTF8 == NULL )
+		return FALSE;
+
+	// 获取宽字符字节数;
+	int cchWideChar  = MultiByteToWideChar(CP_UTF8, 0, lpUTF8, -1, NULL, 0);
+	if ( cchWideChar == 0 )
+		return FALSE;
+
+	// 转换成宽字符串;
+	WCHAR* pResult = new WCHAR[cchWideChar];
+	memset(pResult, 0 , sizeof(WCHAR)*cchWideChar);
+	int nWriteNum = MultiByteToWideChar(CP_UTF8, 0, lpUTF8, -1, pResult, cchWideChar );
+	if ( nWriteNum != cchWideChar)
+		return FALSE;
+
+	strResult = pResult;
+	if ( pResult )
+		delete[] pResult;
+
+	return TRUE;
+}
+
+CHAR* CharEncoding::UTF82ASCII(IN LPCCH lpUTF8)
+{
+	// 将ASCII字符串转成UNICODE字符串;
+	WCHAR* pWideChar = UTF82UNICODE(lpUTF8);
+	if ( pWideChar == NULL )
+		return NULL;
+
+	// 再将UICODE转成UTF8;
+	CHAR* pUTF8 = UNICODE2ASCII(pWideChar);
+	if ( pWideChar )
+		delete []pWideChar;
+
+	return pUTF8;
+}
+
+BOOL CharEncoding::UTF82ASCII(IN LPCCH lpUTF8, OUT LPCH pASCIIStr, IN CONST INT& nASCIIStrLen)
+{
+	// 将ASCII字符串转成UNICODE字符串;
+	WCHAR* pWideChar = UTF82UNICODE(lpUTF8);
+	if ( pWideChar == NULL )
+		return FALSE;
+
+	// 再将UICODE转成UTF8;
+	BOOL bResult = UNICODE2ASCII(pWideChar, pASCIIStr, nASCIIStrLen);
+
+	if ( pWideChar )
+		delete []pWideChar;
+
+	return bResult;
+}
+
+BOOL CharEncoding::UTF82ASCII(IN LPCCH lpUTF8, OUT string &strResult)
+{
+	// 将ASCII字符串转成UNICODE字符串;
+	WCHAR* pWideChar = UTF82UNICODE(lpUTF8);
+	if ( pWideChar == NULL )
+		return FALSE;
+
+	// 再将UICODE转成UTF8;
+	BOOL bResult = UNICODE2ASCII(pWideChar, strResult);
+
+	if ( pWideChar )
+		delete []pWideChar;
+
+	return bResult;
+}
+
+//做为解Url使用
+char CharEncoding::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 CharEncoding::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;
+}
+
+//GB2312 转为 UTF-8
+void CharEncoding::GB2312ToUTF_8(string& pOut, const char *pText, int pLen)
+{
+	char buf[4];
+	memset(buf, 0, 4);
+
+	pOut.clear();
+
+	int i = 0;
+	while (i < pLen)
+	{
+		//如果是英文直接复制就可以;
+		if (pText[i] >= 0)
+		{
+			char asciistr[2] = { 0 };
+			asciistr[0] = (pText[i++]);
+			pOut.append(asciistr);
+		}
+		else
+		{
+			WCHAR pbuffer[2] = {0};
+			MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pText + i, 2, pbuffer, 1);
+			UNICODE2UTF8(pbuffer, buf, 4);
+			pOut.append(buf);
+			i += 2;
+		}
+	}
+
+	return;
+}
+
+/************************************************************************/
+/*  函数:[7/26/2016 IT];
+/*  描述:将字符串编码成为GB2312格式的URL;;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+string CharEncoding::EnCode_GB2312URL(IN CHAR* pText)
+{
+	string dd;
+	size_t len = strlen(pText);
+	for (size_t i = 0; i < len; i++)
+	{
+		if (isalnum((BYTE)pText[i]))
+		{
+			char tempbuff[2];
+			sprintf_s(tempbuff, "%c", pText[i]);
+			dd.append(tempbuff);
+		}
+		else if (isspace((BYTE)pText[i]))
+		{
+			dd.append("+");
+		}
+		else
+		{
+			char tempbuff[4];
+			sprintf_s(tempbuff, "%%%X%X", ((BYTE*)pText)[i] >> 4, ((BYTE*)pText)[i] % 16);
+			dd.append(tempbuff);
+		}
+	}
+	return dd;
+}
+
+void CharEncoding::EnCode_GB2312URL(IN CHAR* pText, OUT string& strResult)
+{
+	size_t len = strlen(pText);
+	for (size_t i = 0; i < len; i++)
+	{
+		if (isalnum((BYTE)pText[i]))
+		{
+			char tempbuff[2];
+			sprintf_s(tempbuff, "%c", pText[i]);
+			strResult.append(tempbuff);
+		}
+		else if (isspace((BYTE)pText[i]))
+		{
+			strResult.append("+");
+		}
+		else
+		{
+			char tempbuff[4];
+			sprintf_s(tempbuff, "%%%X%X", ((BYTE*)pText)[i] >> 4, ((BYTE*)pText)[i] % 16);
+			strResult.append(tempbuff);
+		}
+	}
+}
+
+/************************************************************************/
+/*  函数:[7/26/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+string CharEncoding::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 CharEncoding::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);
+		}
+	}
+}
+
+string CharEncoding::EnCode_UNICODEURL(IN const CHAR* pText)
+{
+	return "";
+}
+
+/************************************************************************/
+/*  函数:[7/26/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+string CharEncoding::DeCode_URLGB2312(IN const CHAR* pURLText)
+{
+	string output = "";
+	char tmp[2];
+	int i = 0, idx = 0, ndx, len = strlen(pURLText);
+
+	while (i < len){
+		if (pURLText[i] == '%')
+		{
+			tmp[0] = pURLText[i + 1];
+			tmp[1] = pURLText[i + 2];
+			output += StrToBin(tmp);
+			i = i + 3;
+		}
+		else if (pURLText[i] == '+')
+		{
+			output += ' ';
+			i++;
+		}
+		else{
+			output += pURLText[i];
+			i++;
+		}
+	}
+
+	return output;
+}
+
+void CharEncoding::DeCode_URLGB2312(IN const CHAR* pURLText, OUT string& strResult)
+{
+	char tmp[2];
+	int i = 0, idx = 0, ndx, len = strlen(pURLText);
+
+	while (i < len){
+		if (pURLText[i] == '%')
+		{
+			tmp[0] = pURLText[i + 1];
+			tmp[1] = pURLText[i + 2];
+			strResult += StrToBin(tmp);
+			i = i + 3;
+		}
+		else if (pURLText[i] == '+')
+		{
+			strResult += ' ';
+			i++;
+		}
+		else{
+			strResult += pURLText[i];
+			i++;
+		}
+	}
+}
+
+/************************************************************************/
+/*  函数:[7/26/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+string CharEncoding::DeCode_URLUTF8(IN const CHAR* pURLText)
+{
+	string output = "";
+	string temp = DeCode_URLGB2312(pURLText);
+	UTF82ASCII(temp.c_str(), output);
+	return output;
+}
+
+void CharEncoding::DeCode_URLUTF8(IN const CHAR* pURLText, OUT string& strResult)
+{
+	string temp = DeCode_URLGB2312(pURLText);
+	UTF82ASCII(temp.c_str(), strResult);
+}
+
+/************************************************************************/
+/*  函数:[7/26/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+string CharEncoding::DeCode_URLUNICODE(IN const CHAR* pURLText)
+{
+	string str = pURLText;
+	string strResult = "";
+
+	INT nIndex = 0;
+	string strTemp = "";
+
+	while ( str.find_first_of("\\u") != string::npos )
+	{
+		nIndex = str.find_first_of("\\u");
+		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;
+}
+
+void CharEncoding::DeCode_URLUNICODE(IN const CHAR* pURLText, OUT string& strResult)
+{
+	string str = pURLText;
+
+	INT nIndex = 0;
+	string strTemp = "";
+
+	while ( str.find_first_of("\\u") != string::npos )
+	{
+		nIndex = str.find_first_of("\\u");
+		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);
+}

+ 97 - 0
source/hook/WeChats/CharEncoding.h

@@ -0,0 +1,97 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:公共模块,未做性能优化;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[7/26/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+#ifndef __CHAR_ENCODING__
+#define __CHAR_ENCODING__
+
+#include <string>
+#include <vector>
+using namespace std;
+
+#ifndef _UNICODE
+typedef string TString;
+#else
+typedef wstring TString;
+#endif
+
+#pragma once
+
+
+class  CharEncoding
+{
+public:
+	// 将字符转化为对应的ASCII十进制值;
+	static char CharToInt(char ch);
+	// 将两个字符串转化成十六进制值;
+	static char StrToBin(IN char (&str)[2]);
+	static void GB2312ToUTF_8(string& pOut, const char *pText, int pLen);
+	// 将ASCII字符串转成UNICODE字符串;
+	static WCHAR* ASCII2UNICODE(IN LPCCH lpASCIIStr);
+	static BOOL   ASCII2UNICODE(IN LPCCH lpASCIIStr, OUT PWCH pUNICODEStr, IN CONST INT& nUNICODEStrLen);
+	static BOOL   ASCII2UNICODE(IN LPCCH lpASCIIStr, OUT wstring &strResult);
+
+	// 将UNICODE字符串转成ASCII字符串;
+	static CHAR* UNICODE2ASCII(IN LPWCH lpUNICODEStr);
+	static BOOL  UNICODE2ASCII(IN LPWCH lpUNICODEStr, OUT LPCH pASCIIStr, IN CONST INT& nASCIIStrLen);
+	static BOOL  UNICODE2ASCII(IN LPWCH lpUNICODEStr, OUT string &strResult);
+
+	// 将UNICODE字符串转成UFT8字符串;
+	static CHAR* UNICODE2UTF8(IN LPWCH lpUNICODEStr);
+	static BOOL  UNICODE2UTF8(IN LPWCH lpUNICODEStr, OUT LPCH pUTF8Str, IN CONST INT& nUTF8StrLen);
+	static BOOL  UNICODE2UTF8(IN LPWCH lpUNICODEStr, OUT string &strResult);
+
+	// 将ASCII字符串转成UTF8字符串;
+	static CHAR* ASCII2UTF8(IN LPCCH lpASCIIStr);
+	static BOOL  ASCII2UTF8(IN LPCCH lpASCIIStr, OUT LPCH pUTF8Str, IN CONST INT& nUTF8StrLen);
+	static BOOL  ASCII2UTF8(IN LPCCH lpASCIIStr, OUT string &strResult);
+
+	// 将UTF-8字符串转成UNICODE字符串;
+	static WCHAR* UTF82UNICODE(IN LPCCH lpUTF8);
+	static BOOL   UTF82UNICODE(IN LPCCH lpUTF8, OUT PWCH pUNICODEStr, IN CONST INT& nUNICODEStrLen);
+	static BOOL   UTF82UNICODE(IN LPCCH lpUTF8, OUT wstring &strResult);
+
+	// 将UTF-8字符串转成ASCII字符串;
+	static CHAR*  UTF82ASCII(IN LPCCH lpUTF8);
+	static BOOL   UTF82ASCII(IN LPCCH lpUTF8, OUT LPCH pASCIIStr, IN CONST INT& nASCIIStrLen);
+	static BOOL   UTF82ASCII(IN LPCCH lpUTF8, OUT string &strResult);
+
+	// 将UTF-8编码成GB2312;
+	static string UTF8IntoGB2313(IN CHAR* pUTF8Text, IN const INT& nUTF8TextLen);
+	// 将GB2312编码成UTF-8;
+	static string GB2312IntoUTF8(IN CHAR* pGB2312Text, IN const INT& nGB2312TextLen);
+
+	// 将字符串编码成为GB2312编码格式的URL;
+	static string EnCode_GB2312URL(IN CHAR* pText);
+	static void EnCode_GB2312URL(IN CHAR* pText, OUT string& strResult);
+	// 将字符串编码成为UTF-8编码格式的URL;
+	static string EnCode_UTF8URL(IN const CHAR* pText);
+	static void EnCode_UTF8URL(IN const CHAR* pText, OUT string& strResult);
+	// 将字符串编码成为UNICODE编码格式的URL;
+	static string EnCode_UNICODEURL(IN const CHAR* pText);	// 未完成该函数;
+
+	// 解码UTF-8编码格式的URL;
+	static string DeCode_URLUTF8(IN const CHAR* pURLText);
+	static void DeCode_URLUTF8(IN const CHAR* pURLText, OUT string& strResult);
+	// 解码GB2312编码格式的URL;
+	static string DeCode_URLGB2312(IN const CHAR* pURLText);
+	static void DeCode_URLGB2312(IN const CHAR* pURLText, OUT string& strResult);
+	// 解码UNICODE编码格式的URL;
+	static string DeCode_URLUNICODE(IN const CHAR* pURLText);
+	static void DeCode_URLUNICODE(IN const CHAR* pURLText, OUT string& strResult);
+};
+
+#endif

+ 530 - 0
source/hook/WeChats/CurlClient.cpp

@@ -0,0 +1,530 @@
+#include "StdAfx.h"
+#include "CurlClient.h"
+#include "curl/curl.h"
+#include "curl/easy.h"
+#include "curl/curlver.h"
+#include "CharEncoding.h"
+
+
+CCurlClient::CCurlClient(void)
+{
+	m_bDebug = TRUE;
+}
+
+CCurlClient::~CCurlClient(void)
+{
+	// 释放curl的全局对象;
+	curl_global_cleanup(); 
+}
+
+INT CCurlClient::Initialize()
+{
+	// 初始化全局调用模式;
+	CURLcode res = ::curl_global_init( CURL_GLOBAL_ALL );
+	if( CURLE_OK != res ) 
+	{
+		fprintf( stderr, "curl_global_init failed: %d \n", res ); 
+		return -1;
+	}
+
+	return 0;
+}
+
+static int OnDebug(CURL *, curl_infotype itype, char * pData, size_t size, void *)   
+{   
+	if(itype == CURLINFO_TEXT)   
+	{   
+		TRACE("[TEXT]%s\n", pData);   
+	}   
+	else if(itype == CURLINFO_HEADER_IN)   
+	{   
+		TRACE("[HEADER_IN]%s\n", pData);   
+	}   
+	else if(itype == CURLINFO_HEADER_OUT)   
+	{   
+		TRACE("[HEADER_OUT]%s\n", pData);   
+	}   
+	else if(itype == CURLINFO_DATA_IN)   
+	{   
+		TRACE("[DATA_IN]%s\n", pData);   
+	}   
+	else if(itype == CURLINFO_DATA_OUT)   
+	{   
+		TRACE("[DATA_OUT]%s\n", pData);   
+	}   
+	return 0;   
+}   
+
+size_t CCurlClient::OnWriteData(const void *ptr, size_t size, size_t nmemb, std::string *stream)   
+{   
+	if( NULL == stream || NULL == ptr )
+		return -1;
+
+	stream->append((char*)ptr, size * nmemb);   
+	return nmemb;   
+}   
+
+int CCurlClient::Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse)   
+{   
+	CURLcode res;   
+	CURL* curl = curl_easy_init();   
+	if(NULL == curl)   
+	{   
+		return CURLE_FAILED_INIT;   
+	}   
+	if(m_bDebug)   
+	{// 是否开启调试日志输出;   
+		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);   
+		curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);   
+	}   
+	// 设置URL地址;
+	curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());   
+	// 设置POST方式;
+	curl_easy_setopt(curl, CURLOPT_POST, 1);   
+	// 设置POST参数;
+	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());  
+    // 设置回调函数-读取;	
+	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);   
+	// 设置回调函数-写入;
+	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);   
+	// 设置回调函数-写入的缓存区;
+	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);   
+	// 设置(多线程下,只是尽量减少)无签名;
+	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);   
+	// 设置连接超时值(单位毫秒);
+	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 30000); 
+	// 设置操作超时值(单位毫秒);
+	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30000);  
+
+	// 执行POST提交;
+	res = curl_easy_perform(curl);   
+	
+	// 释放资源;
+	curl_easy_cleanup(curl); 
+
+	return res;   
+}  
+
+int CCurlClient::Post(IN LPCTSTR lpUrl, IN LPCTSTR lpPost, OUT LPTSTR lpResponse, IN CONST INT& nMaxlen)
+{
+	if ( lpUrl == NULL || lpPost == NULL )
+		return CURLE_FAILED_INIT;
+
+	string strUrl;
+	string strPost;
+	string strResponse;
+#ifdef UNICODE
+	CharEncoding::UNICODE2ASCII((LPWCH)lpUrl, strUrl);
+	CharEncoding::UNICODE2ASCII((LPWCH)lpPost, strPost);
+
+	int res = Post(strUrl, strPost, strResponse) ;
+	if ( CURLE_OK == res )
+	{
+		CharEncoding::ASCII2UNICODE(strResponse.c_str(), (LPWCH)lpResponse, nMaxlen);
+		return CURLE_OK;
+	}
+
+	return res;
+#else
+	strUrl = lpUrl;
+	strPost = lpPost;
+	int res = Post(strUrl, strPost, strResponse) ;
+	if ( CURLE_OK == res )
+	{
+		sprintf_s(lpResponse, nMaxlen, "%s", strResponse.c_str());
+		return CURLE_OK;
+	}
+	return res;
+#endif
+}
+
+int CCurlClient::Post(IN CString& strUrl, IN CString& strPost, OUT CString& strResponse)
+{
+	if ( strUrl.IsEmpty() || strPost.IsEmpty() )
+		return CURLE_FAILED_INIT;
+
+	string url;
+	string post;
+	string response;
+#ifdef UNICODE
+	CharEncoding::UNICODE2ASCII((LPWCH)strUrl.GetString(), url);
+	CharEncoding::UNICODE2ASCII((LPWCH)strPost.GetString(), post);
+
+	int res = Post(url, post, response) ;
+	if ( CURLE_OK == res )
+	{
+		WCHAR* pResult = CharEncoding::ASCII2UNICODE(response.c_str());
+		if ( pResult )
+		{
+			strResponse = pResult;
+			delete []pResult;
+			pResult = NULL;
+			return CURLE_OK;
+		}
+	}
+
+	return res;
+#else
+	url = strUrl.GetString();
+	post = strPost.GetString();
+	int res = Post(url, post, response) ;
+	if ( CURLE_OK == res )
+	{
+		strResponse = response.c_str();
+		return CURLE_OK;
+	}
+	return res;
+#endif
+}
+
+int CCurlClient::Get(const std::string & strUrl, std::string & strResponse)   
+{   
+	CURLcode res;   
+	CURL* curl = curl_easy_init();   
+	if(NULL == curl)   
+	{   
+		return CURLE_FAILED_INIT;   
+	}   
+	if(m_bDebug)   
+	{   
+		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);   
+		curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);   
+	}   
+
+	// 设置URL地址;
+	curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());   
+	// 设置回调函数-读取;
+	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);   
+	// 设置回调函数-写入;
+	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);   
+	// 设置回调函数-写入的缓存区;
+	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);   
+	/**  
+	* 当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。  
+	* 如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。  
+	*/  
+	// 设置(多线程下,只是尽量减少)无签名;	
+	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);   
+	// 设置连接超时值;
+	curl_easy_setopt(curl,CURLOPT_CONNECTTIMEOUT,5000);
+	// 设置超时值;
+	curl_easy_setopt(curl,CURLOPT_TIMEOUT,5000);
+	res = curl_easy_perform(curl);   
+	curl_easy_cleanup(curl);
+
+	return res;   
+}  
+
+int CCurlClient::Get(IN LPCTSTR lpUrl, OUT LPTSTR lpResponse, IN CONST INT& nMaxlen)
+{
+	if ( lpUrl == NULL )
+		return CURLE_FAILED_INIT;
+
+	string strUrl;
+	string strResponse;
+#ifdef UNICODE
+	CharEncoding::UNICODE2ASCII((LPWCH)lpUrl, strUrl);
+
+	int res = Get(strUrl, strResponse) ;
+	if ( CURLE_OK == res )
+	{
+		CharEncoding::ASCII2UNICODE(strResponse.c_str(), (LPWCH)lpResponse, nMaxlen);
+		return CURLE_OK;
+	}
+
+	return res;
+#else
+	strUrl = lpUrl;
+	int res = Get(strUrl, strResponse) ;
+	if ( CURLE_OK == res )
+	{
+		sprintf_s(lpResponse, nMaxlen, "%s", strResponse.c_str());
+		return CURLE_OK;
+	}
+	return res;
+#endif
+}
+
+int CCurlClient::Get(IN CString& strUrl, OUT CString& strResponse)
+{
+	if ( strUrl.IsEmpty() )
+		return CURLE_FAILED_INIT;
+
+	string url;
+	string post;
+	string response;
+#ifdef UNICODE
+	CharEncoding::UNICODE2ASCII((LPWCH)strUrl.GetString(), url);
+
+	int res = Get(url, response) ;
+	if ( CURLE_OK == res )
+	{
+		WCHAR* pResult = CharEncoding::ASCII2UNICODE(response.c_str());
+		if ( pResult )
+		{
+			strResponse = pResult;
+			delete []pResult;
+			pResult = NULL;
+			return CURLE_OK;
+		}
+	}
+
+	return res;
+#else
+	url = strUrl.GetString();
+	int res = Get(url, response) ;
+	if ( CURLE_OK == res )
+	{
+		strResponse = response.c_str();
+		return CURLE_OK;
+	}
+	return res;
+#endif
+}
+
+int CCurlClient::Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse, const char * pCaPath)   
+{   
+	CURLcode res;   
+	CURL* curl = curl_easy_init();   
+	if(NULL == curl)   
+	{   
+		return CURLE_FAILED_INIT;   
+	}   
+	if(m_bDebug)   
+	{   
+		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);   
+		curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);   
+	}   
+	
+	// 设置URL地址;
+	curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());   
+	// 设置POST提交方式;
+	curl_easy_setopt(curl, CURLOPT_POST, 1);   
+	// 设置POST参数;
+	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());   
+	// 设置回调函数-读取;
+	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);   
+	// 设置回调函数-写入;
+	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);   
+	// 设置回调函数-写入的缓存区;
+	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);   
+	// 设置;
+	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);   
+	if(NULL == pCaPath || pCaPath[0] == '\0')   
+	{   
+		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);   
+		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);   
+	}   
+	else   
+	{   
+		//缺省情况就是PEM,所以无需设置,另外支持DER   
+		//curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");   
+		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);   
+		curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);   
+	}   
+	// 设置连接超时值;
+	curl_easy_setopt(curl,CURLOPT_CONNECTTIMEOUT,5000);
+	// 设置超时值;
+	curl_easy_setopt(curl,CURLOPT_TIMEOUT,5000);
+	
+	// 执行POST提交;
+	res = curl_easy_perform(curl);   
+	
+	// 释放资源;
+	curl_easy_cleanup(curl); 
+
+	return res;   
+}  
+
+int CCurlClient::Posts(IN LPCTSTR lpUrl, IN LPCTSTR lpPost, OUT LPTSTR lpResponse, IN CONST INT& nMaxlen, IN LPCTSTR lpCaPath /* = NULL */)
+{
+	if ( lpUrl == NULL || lpPost == NULL )
+		return CURLE_FAILED_INIT;
+
+	string strUrl;
+	string strPost;
+	string strCapath;
+	string strResponse;
+#ifdef UNICODE
+	CharEncoding::UNICODE2ASCII((LPWCH)lpUrl, strUrl);
+	CharEncoding::UNICODE2ASCII((LPWCH)lpPost, strPost);
+	CharEncoding::UNICODE2ASCII((LPWCH)lpCaPath, strCapath);
+
+	int res = Posts(strUrl, strPost, strResponse, strCapath.c_str()) ;
+	if ( CURLE_OK == res )
+	{
+		CharEncoding::ASCII2UNICODE(strResponse.c_str(), (LPWCH)lpResponse, nMaxlen);
+		return CURLE_OK;
+	}
+
+	return res;
+#else
+	strUrl = lpUrl;
+	strPost = lpPost;
+	strCapath = lpCaPath;
+	int res = Posts(strUrl, strPost, strResponse, strCapath.c_str()) ;
+	if ( CURLE_OK == res )
+	{
+		sprintf_s(lpResponse, nMaxlen, "%s", strResponse.c_str());
+		return CURLE_OK;
+	}
+	return res;
+#endif
+}
+
+int CCurlClient::Posts(IN CString& strUrl, IN CString& strPost, OUT CString& strResponse, IN const CString& strCaPath /* = _T("") */)
+{
+	if ( strUrl.IsEmpty() || strPost.IsEmpty() )
+		return CURLE_FAILED_INIT;
+
+	string url;
+	string post;
+	string capth;
+	string response;
+#ifdef UNICODE
+	CharEncoding::UNICODE2ASCII((LPWCH)strUrl.GetString(), url);
+	CharEncoding::UNICODE2ASCII((LPWCH)strPost.GetString(), post);
+	CharEncoding::UNICODE2ASCII((LPWCH)strCaPath.GetString(), capth);
+
+	int res = Posts(url, post, response, capth.c_str()) ;
+	if ( CURLE_OK == res )
+	{
+		WCHAR* pResult = CharEncoding::ASCII2UNICODE(response.c_str());
+		if ( pResult )
+		{
+			strResponse = pResult;
+			delete []pResult;
+			pResult = NULL;
+			return CURLE_OK;
+		}
+	}
+
+	return res;
+#else
+	url = strUrl.GetString();
+	post = strPost.GetString();
+	capth = strCaPath.GetString();
+	int res = Posts(url, post, response, capth.c_str()) ;
+	if ( CURLE_OK == res )
+	{
+		strResponse = response.c_str();
+		return CURLE_OK;
+	}
+	return res;
+#endif
+}
+
+int CCurlClient::Gets(const std::string & strUrl, std::string & strResponse, const char * pCaPath)   
+{   
+	CURLcode res;   
+	CURL* curl = curl_easy_init();   
+	if(NULL == curl)   
+	{   
+		return CURLE_FAILED_INIT;   
+	}   
+	if(m_bDebug)   
+	{   
+		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);   
+		curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);   
+	}   
+	curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());   
+	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);   
+	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);   
+	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);   
+	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);   
+	if(NULL == pCaPath || pCaPath[0] == '\0')   
+	{   
+		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);   
+		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);   
+	}   
+	else   
+	{   
+		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);   
+		curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);   
+	}   
+	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);   
+	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);   
+	res = curl_easy_perform(curl);   
+	curl_easy_cleanup(curl); 
+
+	return res;   
+} 
+
+int CCurlClient::Gets(IN LPCTSTR lpUrl, OUT LPTSTR lpResponse, IN CONST INT& nMaxlen, IN LPCTSTR lpCaPath /* = NULL */)
+{
+	if ( lpUrl == NULL )
+		return CURLE_FAILED_INIT;
+
+	string strUrl;
+	string strCapath;
+	string strResponse;
+#ifdef UNICODE
+	CharEncoding::UNICODE2ASCII((LPWCH)lpUrl, strUrl);
+	CharEncoding::UNICODE2ASCII((LPWCH)lpCaPath, strCapath);
+
+	int res = Gets(strUrl, strResponse, strCapath.c_str()) ;
+	if ( CURLE_OK == res )
+	{
+		CharEncoding::ASCII2UNICODE(strResponse.c_str(), (LPWCH)lpResponse, nMaxlen);
+		return CURLE_OK;
+	}
+
+	return res;
+#else
+	strUrl = lpUrl;
+	strCapath = lpCaPath;
+	int res = Gets(strUrl, strResponse, strCapath.c_str()) ;
+	if ( CURLE_OK == res )
+	{
+		sprintf_s(lpResponse, nMaxlen, "%s", strResponse.c_str());
+		return CURLE_OK;
+	}
+	return res;
+#endif
+}
+
+int CCurlClient::Gets(IN CString& strUrl, OUT CString& strResponse, IN const CString& strCaPath /* = _T("") */)
+{
+	if ( strUrl.IsEmpty() )
+		return CURLE_FAILED_INIT;
+
+	string url;
+	string post;
+	string capth;
+	string response;
+#ifdef UNICODE
+	CharEncoding::UNICODE2ASCII((LPWCH)strUrl.GetString(), url);
+	CharEncoding::UNICODE2ASCII((LPWCH)strCaPath.GetString(), capth);
+
+	int res = Gets(url, response, capth.c_str()) ;
+	if ( CURLE_OK == res )
+	{
+		WCHAR* pResult = CharEncoding::ASCII2UNICODE(response.c_str());
+		if ( pResult )
+		{
+			strResponse = pResult;
+			delete []pResult;
+			pResult = NULL;
+			return CURLE_OK;
+		}
+	}
+
+	return res;
+#else
+	url = strUrl.GetString();
+	capth = strCaPath.GetString();
+	int res = Gets(url, response, capth.c_str()) ;
+	if ( CURLE_OK == res )
+	{
+		strResponse = response.c_str();
+		return CURLE_OK;
+	}
+	return res;
+#endif
+}
+
+void CCurlClient::SetDebug(bool bDebug)   
+{   
+	m_bDebug = bDebug;   
+}   
+

+ 77 - 0
source/hook/WeChats/CurlClient.h

@@ -0,0 +1,77 @@
+#ifndef __CURLCLIENT__
+#define __CURLCLIENT__
+
+#include <string>
+#include <vector>
+using namespace std;
+
+#ifndef _UNICODE
+typedef string TString;
+#else
+typedef wstring TString;
+#endif
+
+#pragma once
+
+class  CCurlClient
+{
+public:
+	CCurlClient(void);
+	~CCurlClient(void);
+
+public:
+	INT Initialize();
+	/**  
+	* @brief HTTP POST请求  
+	* @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com  
+	* @param strPost 输入参数,使用如下格式para1=val1?2=val2&…  
+	* @param strResponse 输出参数,返回的内容  
+	* @return 返回是否Post成功  
+	*/   
+	int Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse);
+	int Post(IN LPCTSTR lpUrl, IN LPCTSTR lpPost, OUT LPTSTR lpResponse, IN CONST INT& nMaxlen);
+	int Post(IN CString& strUrl, IN CString& strPost, OUT CString& strResponse);
+
+	/**  
+	* @brief HTTP GET请求  
+	* @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com  
+	* @param strResponse 输出参数,返回的内容  
+	* @return 返回是否Post成功  
+	*/   
+	int Get(const std::string & strUrl, std::string & strResponse); 
+	int Get(IN LPCTSTR lpUrl, OUT LPTSTR lpResponse, IN CONST INT& nMaxlen);
+	int Get(IN CString& strUrl, OUT CString& strResponse);
+
+	/**  
+	* @brief HTTPS POST请求,无证书版本  
+	* @param strUrl 输入参数,请求的Url地址,如:https://www.alipay.com  
+	* @param strPost 输入参数,使用如下格式para1=val1?2=val2&…  
+	* @param strResponse 输出参数,返回的内容  
+	* @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性.  
+	* @return 返回是否Post成功  
+	*/   
+	int Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse, const char * pCaPath = NULL);   
+	int Posts(IN LPCTSTR lpUrl, IN LPCTSTR lpPost, OUT LPTSTR lpResponse, IN CONST INT& nMaxlen, IN LPCTSTR lpCaPath = NULL);
+	int Posts(IN CString& strUrl, IN CString& strPost, OUT CString& strResponse, IN const CString& strCaPath = _T(""));
+
+	/**  
+	* @brief HTTPS GET请求,无证书版本  
+	* @param strUrl 输入参数,请求的Url地址,如:https://www.alipay.com  
+	* @param strResponse 输出参数,返回的内容  
+	* @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性.  
+	* @return 返回是否Post成功  
+	*/   
+	int Gets(const std::string & strUrl, std::string & strResponse, const char * pCaPath = NULL); 
+	int Gets(IN LPCTSTR lpUrl, OUT LPTSTR lpResponse, IN CONST INT& nMaxlen, IN LPCTSTR lpCaPath = NULL);
+	int Gets(IN CString& strUrl, OUT CString& strResponse, IN const CString& strCaPath = _T(""));
+
+public:   
+	void SetDebug(bool bDebug);   
+
+private:   
+	// 是否启用调试输出;
+	BOOL	m_bDebug;	
+	static size_t OnWriteData(const void *ptr, size_t size, size_t nmemb, std::string *stream);
+};
+
+#endif

+ 8 - 4
source/hook/WeChats/WeChats.vcxproj

@@ -61,7 +61,7 @@
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -82,7 +82,7 @@
       <SubSystem>Windows</SubSystem>
       <TargetMachine>MachineX86</TargetMachine>
       <AdditionalLibraryDirectories>..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>libprotobufd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>libprotobufd.lib;ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -94,7 +94,7 @@
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -116,7 +116,7 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <TargetMachine>MachineX86</TargetMachine>
       <AdditionalLibraryDirectories>..\lib</AdditionalLibraryDirectories>
-      <AdditionalDependencies>libprotobuf.lib;</AdditionalDependencies>
+      <AdditionalDependencies>libprotobuf.lib;ws2_32.lib;wldap32.lib;libcurl.lib</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -140,6 +140,8 @@
     <ClCompile Include="..\skinui\SubLabel.cpp" />
     <ClCompile Include="..\skinui\TreeComboBox.cpp" />
     <ClCompile Include="CDLG_Login.cpp" />
+    <ClCompile Include="CharEncoding.cpp" />
+    <ClCompile Include="CurlClient.cpp" />
     <ClCompile Include="CWxObject.cpp" />
     <ClCompile Include="Global.cpp" />
     <ClCompile Include="Injection.cpp" />
@@ -169,6 +171,8 @@
     <ClInclude Include="..\skinui\SubLabel.h" />
     <ClInclude Include="..\skinui\TreeComboBox.h" />
     <ClInclude Include="CDLG_Login.h" />
+    <ClInclude Include="CharEncoding.h" />
+    <ClInclude Include="CurlClient.h" />
     <ClInclude Include="CWxObject.h" />
     <ClInclude Include="Global.h" />
     <ClInclude Include="IClient.h" />

+ 15 - 0
source/hook/WeChats/WeChats.vcxproj.filters

@@ -19,6 +19,9 @@
     <Filter Include="skinui">
       <UniqueIdentifier>{897b5774-040d-46dc-a590-8dbc3cd600a4}</UniqueIdentifier>
     </Filter>
+    <Filter Include="curl">
+      <UniqueIdentifier>{f55a18d1-6921-41d2-b53b-905b1db5544e}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Global.cpp">
@@ -93,6 +96,12 @@
     <ClCompile Include="..\skinui\TreeComboBox.cpp">
       <Filter>skinui</Filter>
     </ClCompile>
+    <ClCompile Include="CharEncoding.cpp">
+      <Filter>curl</Filter>
+    </ClCompile>
+    <ClCompile Include="CurlClient.cpp">
+      <Filter>curl</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Global.h">
@@ -176,6 +185,12 @@
     <ClInclude Include="..\skinui\TreeComboBox.h">
       <Filter>skinui</Filter>
     </ClInclude>
+    <ClInclude Include="CharEncoding.h">
+      <Filter>curl</Filter>
+    </ClInclude>
+    <ClInclude Include="CurlClient.h">
+      <Filter>curl</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Image Include="res\WeChats.ico">

+ 6 - 3
source/hook/WeChats/WeChatsDlg.cpp

@@ -196,10 +196,13 @@ void CWeChatsDlg::OnBtnClickedWxName(UINT uID)
 	CStatic *pWxChatWnd = m_wxMgr.GetWxChatWnd(m_wxMgr.m_mapIds[uID]);
 	CWxObject *pWxObject = m_wxMgr.GetWxObject(m_wxMgr.m_mapIds[uID]);
 
-	pButton->SetCheck(TRUE);
-	pWxChatWnd->ShowWindow(SW_SHOW);
+	if (pButton->GetCheck() == FALSE)
+	{
+		pButton->SetCheck(TRUE);
+		pWxChatWnd->ShowWindow(SW_SHOW);
 
-	lastID = uID;
+		lastID = uID;
+	}
 }
 
 HBRUSH CWeChatsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

+ 5 - 5
source/hook/WeChats/WxMgr.cpp

@@ -169,16 +169,16 @@ VOID CWxMgr::AddMapItem(DWORD dwProcId, LPCTSTR lpItemName)
 	// ´´½¨°´Å¥;//idʹÓÃ×Ô½¨µÄ;
 	wxObjInfo.pWxButton = new CButtonST();
 	wxObjInfo.pWxButton->Create(lpItemName, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, CalcRect(), m_pMainWnd, GetFreeButtonId(dwProcId));
-	wxObjInfo.pWxButton->OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 60);
-	//wxObjInfo.pWxButton->DrawTransparent();
-	//wxObjInfo.pWxButton->SetIcon(ICON_CHECK);
 #ifdef DEBUG
 	//HBITMAP hBitmapIn = (HBITMAP)::LoadImage(NULL, _T("E:\\bin\\WeChats2017\\image\\132.jpg"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
 	HBITMAP hBitmapIn = LoadImgFromFile(_T("E:\\bin\\WeChats2017\\image\\132.jpg"));
 	if (hBitmapIn)
-		wxObjInfo.pWxButton->SetBitmaps(hBitmapIn, COLORREF(0));
+		wxObjInfo.pWxButton->SetBitmaps(hBitmapIn, COLORREF(120));
 #endif // DEBUG
-
+	wxObjInfo.pWxButton->OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 250, FALSE);
+	//wxObjInfo.pWxButton->DrawTransparent(TRUE);
+	//wxObjInfo.pWxButton->SetIcon(ICON_CHECK);
+	wxObjInfo.pWxButton->OffsetColor(CButtonST::BTNST_COLOR_BK_OUT, 32, FALSE);
 	wxObjInfo.pWxButton->ShowWindow(SW_SHOW);
 	wxObjInfo.pWxButton->SetCheck(FALSE);