395 lines
8.4 KiB
C++
395 lines
8.4 KiB
C++
// GUCodeCreator.cpp: implementation of the CGUCodeCreator class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "geomative.h"
|
|
#include "GUCodeCreator.h"
|
|
#include "Constant.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
CGUCodeCreator::CGUCodeCreator()
|
|
{
|
|
int iIndex = (int)VAL_ZERO;
|
|
char cChar = '0';
|
|
/*
|
|
while (iIndex < 6)
|
|
{
|
|
m_aMacAddress[iIndex++] = (int)VAL_ZERO;
|
|
}
|
|
*/
|
|
memset(m_aMacAddress, 0, sizeof(m_aMacAddress));
|
|
|
|
iIndex = (int)VAL_ZERO;
|
|
while (iIndex < 10)
|
|
{
|
|
m_aMappingTable[iIndex++] = cChar++;
|
|
}
|
|
|
|
cChar = 'A';
|
|
while (iIndex < 32)
|
|
{
|
|
m_aMappingTable[iIndex++] = cChar++;
|
|
}
|
|
}
|
|
|
|
CGUCodeCreator::~CGUCodeCreator()
|
|
{
|
|
|
|
}
|
|
|
|
bool CGUCodeCreator::GetMacAddress(BYTE *pMacAddress)
|
|
{
|
|
PIP_ADAPTER_INFO pAdapterInfo;
|
|
DWORD dwAdapterInfoSize;
|
|
DWORD dwErr;
|
|
int iIndex = 0;
|
|
|
|
dwAdapterInfoSize = 0;
|
|
dwErr = GetAdaptersInfo(NULL, &dwAdapterInfoSize);
|
|
if ((dwErr != (int)VAL_ZERO) && (dwErr != ERROR_BUFFER_OVERFLOW))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, dwAdapterInfoSize);
|
|
if (pAdapterInfo == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
PIP_ADAPTER_INFO pTemp = pAdapterInfo;
|
|
if (GetAdaptersInfo(pAdapterInfo, &dwAdapterInfoSize) != (int)VAL_ZERO)
|
|
{
|
|
GlobalFree(pAdapterInfo);
|
|
return false;
|
|
}
|
|
|
|
while (pAdapterInfo)
|
|
{
|
|
if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
|
|
{
|
|
for (iIndex = (int)VAL_ZERO; iIndex < 6; iIndex++)
|
|
{
|
|
*pMacAddress++ = pAdapterInfo->Address[iIndex];
|
|
}
|
|
break;
|
|
}
|
|
pAdapterInfo = pAdapterInfo->Next;
|
|
}
|
|
|
|
if (pTemp)
|
|
{
|
|
GlobalFree(pTemp);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
DWORD CGUCodeCreator::GetTotalSecond()
|
|
{
|
|
int iYear = (int)YEAR_BASE;
|
|
int iCurYear = (int)VAL_ZERO;
|
|
int iCurDay = (int)VAL_ZERO;
|
|
int iCurHour = (int)VAL_ZERO;
|
|
int iCurMin = (int)VAL_ZERO;
|
|
int iCurSec = (int)VAL_ZERO;
|
|
DWORD dwSecond = (DWORD)VAL_ZERO;
|
|
time_t lTime = (time_t)VAL_ZERO;
|
|
struct tm *pTM = NULL;
|
|
|
|
Sleep(1000);
|
|
time(&lTime);
|
|
|
|
pTM = localtime(&lTime);
|
|
|
|
iCurYear = 1900 + pTM->tm_year;
|
|
iCurDay = pTM->tm_yday;
|
|
iCurHour = pTM->tm_hour;
|
|
iCurMin = pTM->tm_min;
|
|
iCurSec = pTM->tm_sec;
|
|
|
|
dwSecond = iCurDay*86400+((iCurHour*60+iCurMin)*60+iCurSec+1);
|
|
|
|
while (iYear < iCurYear)
|
|
{
|
|
if (((iYear % 4 == (int)VAL_ZERO) && (iYear % 100 != (int)VAL_ZERO)) || (iYear % 400 == (int)VAL_ZERO))
|
|
{
|
|
dwSecond += 31622400;
|
|
}
|
|
else
|
|
{
|
|
dwSecond += 31536000;
|
|
}
|
|
iYear++;
|
|
}
|
|
|
|
return dwSecond;
|
|
}
|
|
|
|
bool CGUCodeCreator::ChangeMacAddressToCode(char *pCode)
|
|
{
|
|
BYTE bTempVal = (BYTE)VAL_ZERO;
|
|
BYTE bHTempVal = (BYTE)VAL_ZERO, bMTempVal = (BYTE)VAL_ZERO, bLTempVal = (BYTE)VAL_ZERO;
|
|
int aTempVal[10] = {(int)VAL_ZERO};
|
|
int iIndex = (int)VAL_ZERO;
|
|
|
|
bLTempVal = this->m_aMacAddress[5];
|
|
bLTempVal &= 0x1F;
|
|
aTempVal[9] = (int)bLTempVal;
|
|
|
|
bLTempVal = (BYTE)VAL_ZERO;
|
|
bHTempVal = (BYTE)VAL_ZERO;
|
|
bLTempVal = m_aMacAddress[5];
|
|
bLTempVal >>= 5;
|
|
bHTempVal = m_aMacAddress[4];
|
|
bHTempVal <<= 3;
|
|
bHTempVal &= 0x18;
|
|
aTempVal[8] = (int)(bHTempVal | bLTempVal);
|
|
|
|
bLTempVal = (BYTE)VAL_ZERO;
|
|
bHTempVal = (BYTE)VAL_ZERO;
|
|
bLTempVal = m_aMacAddress[4];
|
|
bLTempVal >>= 2;
|
|
bLTempVal &= 0x1F;
|
|
aTempVal[7] = (int)bLTempVal;
|
|
|
|
bLTempVal = (BYTE)VAL_ZERO;
|
|
bHTempVal = (BYTE)VAL_ZERO;
|
|
bLTempVal = m_aMacAddress[4];
|
|
bLTempVal >>= 7;
|
|
bHTempVal = m_aMacAddress[3];
|
|
bHTempVal <<= 1;
|
|
bHTempVal &= 0x1E;
|
|
aTempVal[6] = (int)(bHTempVal | bLTempVal);
|
|
|
|
bLTempVal = (BYTE)VAL_ZERO;
|
|
bHTempVal = (BYTE)VAL_ZERO;
|
|
bLTempVal = m_aMacAddress[3];
|
|
bLTempVal >>= 4;
|
|
bHTempVal = m_aMacAddress[2];
|
|
bHTempVal <<= 4;
|
|
bHTempVal &= 0x10;
|
|
aTempVal[5] = (int)(bHTempVal | bLTempVal);
|
|
|
|
bLTempVal = (BYTE)VAL_ZERO;
|
|
bHTempVal = (BYTE)VAL_ZERO;
|
|
bLTempVal = m_aMacAddress[2];
|
|
bLTempVal >>= 1;
|
|
bLTempVal &= 0x1F;
|
|
aTempVal[4] = (int)bLTempVal;
|
|
|
|
bLTempVal = (BYTE)VAL_ZERO;
|
|
bHTempVal = (BYTE)VAL_ZERO;
|
|
bLTempVal = m_aMacAddress[2];
|
|
bLTempVal >>= 6;
|
|
bHTempVal = m_aMacAddress[1];
|
|
bHTempVal <<= 2;
|
|
bHTempVal &= 0x1C;
|
|
aTempVal[3] = (int)(bHTempVal | bLTempVal);
|
|
|
|
bLTempVal = (BYTE)VAL_ZERO;
|
|
bHTempVal = (BYTE)VAL_ZERO;
|
|
bLTempVal = m_aMacAddress[1];
|
|
bLTempVal >>= 3;
|
|
aTempVal[2] = (int)bLTempVal;
|
|
|
|
bLTempVal = (BYTE)VAL_ZERO;
|
|
bHTempVal = (BYTE)VAL_ZERO;
|
|
bLTempVal = m_aMacAddress[0];
|
|
bLTempVal &= 0x1F;
|
|
aTempVal[1] = (int)bLTempVal;
|
|
|
|
bLTempVal = (BYTE)VAL_ZERO;
|
|
bHTempVal = (BYTE)VAL_ZERO;
|
|
bLTempVal = this->m_aMacAddress[0];
|
|
bLTempVal >>= 5;
|
|
aTempVal[0] = (int)bLTempVal;
|
|
|
|
iIndex = 9;
|
|
while (iIndex >= (int)VAL_ZERO)
|
|
{
|
|
*(pCode+iIndex) = m_aMappingTable[(int)aTempVal[iIndex]];
|
|
iIndex--;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CGUCodeCreator::ChangeTotalSecToCode(char *pCode)
|
|
{
|
|
int aTempVal[GUC_LENGTH-11] = {(int)VAL_ZERO};
|
|
int iIndex = (int)VAL_ZERO;
|
|
DWORD dwSec = (DWORD)VAL_ZERO;
|
|
|
|
dwSec = m_dwCurTotalSec;
|
|
for (iIndex = (GUC_LENGTH-12); iIndex >= (int)VAL_ZERO; iIndex--)
|
|
{
|
|
aTempVal[iIndex] = dwSec & 0x0000001F;
|
|
dwSec >>= 5;
|
|
}
|
|
|
|
for (iIndex = (GUC_LENGTH-12); iIndex >= (int)VAL_ZERO; iIndex--)
|
|
{
|
|
*(pCode+iIndex) = m_aMappingTable[(int)aTempVal[iIndex]];
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
CString CGUCodeCreator::GenerateGUCode()
|
|
{
|
|
int iIndex = (int)VAL_ZERO;
|
|
char aGUCode[GUC_LENGTH] = {0};
|
|
CString szGUCode;
|
|
|
|
while (iIndex < GUC_LENGTH)
|
|
{
|
|
aGUCode[iIndex++] = (int)VAL_ZERO;
|
|
}
|
|
|
|
memset(m_aMacAddress, 0, sizeof(m_aMacAddress));
|
|
GetMacAddress((BYTE*)m_aMacAddress);
|
|
m_dwCurTotalSec = GetTotalSecond();
|
|
|
|
ChangeMacAddressToCode((char*)aGUCode);
|
|
ChangeTotalSecToCode((char*)(aGUCode+10));
|
|
|
|
szGUCode.Empty();
|
|
szGUCode = (LPCTSTR)aGUCode;
|
|
return szGUCode;
|
|
}
|
|
|
|
CString CGUCodeCreator::GenerateGUIDCode()
|
|
{
|
|
CString szGUID = _T("");
|
|
GUID guid;
|
|
|
|
::CoInitialize(NULL);
|
|
|
|
if(S_OK == ::CoCreateGuid(&guid))
|
|
{
|
|
szGUID.Empty();
|
|
szGUID.Format("%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X",
|
|
guid.Data1,
|
|
guid.Data2,
|
|
guid.Data3,
|
|
guid.Data4[0], guid.Data4[1],
|
|
guid.Data4[2], guid.Data4[3],
|
|
guid.Data4[4], guid.Data4[5],
|
|
guid.Data4[6], guid.Data4[7]);
|
|
}
|
|
|
|
::CoUninitialize();
|
|
return szGUID;
|
|
}
|
|
|
|
CString CGUCodeCreator::GenerateMacAddress(void)
|
|
{
|
|
|
|
CString szMacAddress = _T("");
|
|
|
|
|
|
memset(m_aMacAddress, 0, sizeof(m_aMacAddress));
|
|
GetMacAddress((BYTE*)m_aMacAddress);
|
|
|
|
//////////////////////////////add by lsq 20160402////////////////////////////////////////////
|
|
//在这里由于去除注册功能的需要,因此将所有机器的MAC地址用
|
|
//统一的一个MAC地址来代替
|
|
memset(m_aMacAddress, 0, sizeof(m_aMacAddress));
|
|
m_aMacAddress[0] = 0x00;
|
|
m_aMacAddress[1] = 0x00;
|
|
m_aMacAddress[2] = 0x00;
|
|
m_aMacAddress[3] = 0xFF;
|
|
m_aMacAddress[4] = 0xFF;
|
|
m_aMacAddress[5] = 0xFF;
|
|
|
|
/////////////////////////////////end/////////////////////////////////////////
|
|
|
|
|
|
szMacAddress.Empty();
|
|
szMacAddress.Format(_T("%02X%02X%02X%02X%02X%02X"),
|
|
m_aMacAddress[0],
|
|
m_aMacAddress[1],
|
|
m_aMacAddress[2],
|
|
m_aMacAddress[3],
|
|
m_aMacAddress[4],
|
|
m_aMacAddress[5]);
|
|
|
|
return szMacAddress;
|
|
}
|
|
|
|
void CGUCodeCreator::GetMacList(CStringArray *f_macArray)
|
|
{
|
|
//added by lsq 20160406
|
|
//由于上下微机统一使用一个MAC地址,所以这里直接用这个MAC地址返回,之前的代码就不用了
|
|
f_macArray->Add(_T("000000FFFFFF"));
|
|
return;
|
|
|
|
/////////////////////////////end/////////////////////////////////////////////
|
|
PIP_ADAPTER_INFO pAdapterInfo;
|
|
DWORD dwAdapterInfoSize;
|
|
DWORD dwErr;
|
|
int iIndex = 0;
|
|
|
|
BYTE bMac[16];
|
|
memset(bMac, 0, 16);
|
|
CString szTmp = _T("");
|
|
|
|
dwAdapterInfoSize = 0;
|
|
dwErr = GetAdaptersInfo(NULL, &dwAdapterInfoSize);
|
|
if ((dwErr != (int)VAL_ZERO) && (dwErr != ERROR_BUFFER_OVERFLOW))
|
|
{
|
|
f_macArray->Add("000000000000");
|
|
return;
|
|
}
|
|
|
|
pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, dwAdapterInfoSize);
|
|
if (pAdapterInfo == NULL)
|
|
{
|
|
f_macArray->Add("000000000000");
|
|
return;
|
|
}
|
|
|
|
if (GetAdaptersInfo(pAdapterInfo, &dwAdapterInfoSize) != (int)VAL_ZERO)
|
|
{
|
|
GlobalFree(pAdapterInfo);
|
|
return;
|
|
}
|
|
|
|
while (pAdapterInfo)
|
|
{
|
|
if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
|
|
{
|
|
for (iIndex = (int)VAL_ZERO; iIndex < 6; iIndex++)
|
|
{
|
|
bMac[iIndex] = pAdapterInfo->Address[iIndex];
|
|
}
|
|
|
|
szTmp.Format(_T("%02X%02X%02X%02X%02X%02X"),
|
|
bMac[0],
|
|
bMac[1],
|
|
bMac[2],
|
|
bMac[3],
|
|
bMac[4],
|
|
bMac[5]);
|
|
f_macArray->Add(szTmp);
|
|
}
|
|
pAdapterInfo = pAdapterInfo->Next;
|
|
}
|
|
|
|
if (f_macArray->GetSize() == 0)
|
|
{
|
|
f_macArray->Add("000000000000");
|
|
}
|
|
|
|
GlobalFree(pAdapterInfo);
|
|
|
|
}
|