// AppTemplateDlg.cpp : 实现文件 // #include "stdafx.h" #include "SimpleEnDecode.h" #include "AppTemplateDlg.h" #include "Password.h" #include "afxdialogex.h" extern CHAR *g_szCurrentDir; // CAppTemplateDlg 对话框 IMPLEMENT_DYNAMIC(CAppTemplateDlg, CDialogEx) /*重载构造函数,调用*/ CAppTemplateDlg::CAppTemplateDlg(BOOL bType, CWnd *pParent) : CDialogEx(CAppTemplateDlg::IDD, pParent) ,m_bType(bType) ,m_strPassword(_T("")) ,m_strDirectory(_T("")) ,m_strLog(_T("")) ,m_strTitile(_T("简单文件加解密程序→解密文件")) // ,m_strLogFileName(_T("")) ,m_strNewFileName(_T("")) ,m_strRun(_T("解密文件")) ,m_strFileNameArray() ,m_strErrorFileNameArray() ,m_hFileRead(NULL) ,m_hFileWrite(NULL) ,m_hMappingRead(NULL) ,m_hMappingWrite(NULL) ,m_llFileSize(0) ,m_llFileSizeNew(0) ,m_pThread(NULL) { /*设置日志绝对路径*/ if (bType) { m_strTitile = _T("简单文件加解密程序→加密文件"); m_strRun = _T("加密文件"); sprintf(m_szLogFileName, "%s\\SimpleEnDecode Logs\\LogEncode.txt", g_szCurrentDir); } else { sprintf(m_szLogFileName, "%s\\SimpleEnDecode Logs\\LogDecode.txt", g_szCurrentDir); } ZeroMemory(m_szRoot, ROOT_LENTH * sizeof(CHAR)); ZeroMemory(&m_stHeader, sizeof(HEADER)); ZeroMemory(m_szFileName, MAX_PATH * sizeof(CHAR)); ZeroMemory(m_szNewFileName, MAX_PATH * sizeof(CHAR)); ZeroMemory(m_szPassword, BUF_SIZE * sizeof(UCHAR)); ZeroMemory(m_szWork, BUF_SIZE * sizeof(UCHAR)); ZeroMemory(&m_SysInfo, sizeof(SYSTEM_INFO)); sprintf(m_szAdvSettingsPath, "%s\\AdvSettings", g_szCurrentDir); sprintf(m_szAppName, "%s\\AdvSettings\\SimpleEnDecode.ini", g_szCurrentDir); /*设置高级配置信息*/ m_bAdvSwitch = FALSE; /*只有存在了配置文件,才初始化这些配置变量*/ if (TRUE == PathFileExistsA(m_szAppName)) { /*设置节信息*/ sprintf(m_szSwitchTitle, "SWITCH"); sprintf(m_szSwitchKey, "TYPE"); sprintf(m_szStringTitle, "ENCODESTRING"); sprintf(m_szStringKey, "METHORD"); sprintf(m_szArrayTitle, "RANDOMARRAY"); for (int i = 0; i < BUF_SIZE; i += 16) { sprintf(m_szArrayKey[i/16], "%02X--%02X", i, i + 15); } } } CAppTemplateDlg::~CAppTemplateDlg() { /*这里都强制关闭文件句柄,防止程序异常退出时有未关闭的句柄*/ /* CloseHandle(m_hFileRead); CloseHandle(m_hFileWrite); CloseHandle(m_hMappingRead); CloseHandle(m_hMappingWrite); */ } void CAppTemplateDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDB_RUN, m_BtnRun); DDX_Control(pDX, IDL_FILELIST, m_ListFile); DDX_Control(pDX, IDP_RUNNING, m_ProcCtrl); } BEGIN_MESSAGE_MAP(CAppTemplateDlg, CDialogEx) ON_BN_CLICKED(IDB_BROWSEDIR, &CAppTemplateDlg::OnClickedIdbBrowsedir) ON_BN_CLICKED(IDB_BROWSEFILES, &CAppTemplateDlg::OnClickedIdbBrowsefiles) ON_BN_CLICKED(IDB_RUN, &CAppTemplateDlg::OnClickedIdbRun) END_MESSAGE_MAP() // CAppTemplateDlg 消息处理程序 void CAppTemplateDlg::OnClickedIdbBrowsedir() { /*如果Button可见,则表示选择任务取消*/ if (TRUE == m_BtnRun.IsWindowVisible()) { m_strLog = _T("任务取消"); WriteLog(); } EmptyAll(); InitCommonControls(); BROWSEINFO bf = {0}; bf.lpszTitle = _T("简单文件加解密程序→选择文件所在目录:"); bf.hwndOwner = this->m_hWnd; bf.pidlRoot = NULL; TCHAR strBrowsePath[MAX_PATH]; /*选择加密目录*/ LPITEMIDLIST lpItem = SHBrowseForFolder(&bf); SHGetPathFromIDList(lpItem, strBrowsePath); /*释放资源*/ LPMALLOC lpMalloc; if(E_FAIL == SHGetMalloc(&lpMalloc)) { return; } lpMalloc->Free(lpItem); lpMalloc->Release(); m_strDirectory += strBrowsePath; /*如果选择的是非法目录比如(计算机或者我的电脑)*/ if (TRUE == m_strDirectory.IsEmpty()) { return ; } CFileFind fd; CString strFindPath; /*设置搜索路径*/ if (_T(":\\") == m_strDirectory.Right(2)) { /*如果选择的是磁盘根目录,则加上“*.*” */ strFindPath = m_strDirectory + _T("*.*"); } else { /*如果选择的是文件夹目录,则加上“\\*.*”*/ strFindPath = m_strDirectory + _T("\\*.*"); } /*开始搜索指定目录下的所有文件*/ fd.FindFile( strFindPath); BOOL bRet = fd.FindFile( strFindPath); while (FALSE != bRet) { bRet = fd.FindNextFile(); /*去除点目录和其他目录项*/ if ( fd.IsDots() || fd.IsDirectory()) { continue; } /*保存文件名到CStringArray对象中*/ m_strFileNameArray.Add( fd.GetFilePath()); } /*如果选择目录下没有文件*/ if (0 == m_strFileNameArray.GetSize()) { MessageBox(_T("当前目录为空,无可操作文件")); return ; } /*设置窗口静态文本内容*/ SetDlgItemText(IDT_DIRECTORY, m_strDirectory); SetDlgItemText(IDT_TIP_DIR, _T("选择的路径为:")); /*任务开始前在末尾加两个换行*/ m_strLog = _T("\r\n"); WriteLog(FALSE); /*在ListBox控件中添加文件信息*/ for(int i = 0; i < m_strFileNameArray.GetCount(); i++) { m_ListFile.AddString( m_strFileNameArray[i]); m_strLog = _T("选择任务文件:") + m_strFileNameArray[i]; WriteLog(); } SetHorizonScole(); /*显示操作按钮*/ m_BtnRun.ShowWindow(TRUE); } /* 修改历史: 1: 自定义文件对话框所选文件名内存空间,系统默认的空间不足以存储大量文件。 2: 设置最大可操作文件数量为256,可根据需要继续加大。 */ void CAppTemplateDlg::OnClickedIdbBrowsefiles() { /*如果Button可见,则表示选择任务取消*/ if (TRUE == m_BtnRun.IsWindowVisible()) { m_strLog = _T("任务取消"); WriteLog(); } EmptyAll(); CFileDialog DlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT | OFN_FILEMUSTEXIST | OFN_EXPLORER ); /*设置缓冲区大小,防止文件名过长,或者选择文件过多的情况出现*/ /*定义缓冲区*/ CString strFileName; /*定义最大文件数量,这里使用256*/ const int c_cMaxFiles = 256; /*定义缓冲区大小*/ const int c_cbBufSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1; /*设置文件对话框属性*/ DlgFile.m_ofn.lpstrFile = strFileName.GetBuffer(c_cbBufSize); DlgFile.m_ofn.nMaxFile = c_cbBufSize; if(IDCANCEL == DlgFile.DoModal()) { /*如果没有选择文件*/ return ; } /*遍历所有选择文件,保存到CStringArray对象中*/ POSITION po = DlgFile.GetStartPosition(); while(NULL != po) { CString strPath = DlgFile.GetNextPathName(po); m_strFileNameArray.Add(strPath); } /*文件对话框使用完毕,释放内存*/ strFileName.ReleaseBuffer(); /*设定选择的路径信息*/ int nDirIdx = m_strFileNameArray[0].ReverseFind('\\'); m_strDirectory = m_strFileNameArray[0].Left(nDirIdx+1); SetDlgItemText(IDT_TIP_DIR, _T("选择的路径为:")); SetDlgItemText(IDT_DIRECTORY, m_strDirectory); /*任务开始前在日志末尾加换行*/ m_strLog = _T("\r\n"); WriteLog(FALSE); /*添加文件信息到ListBox控件中*/ for (int i = 0; i< m_strFileNameArray.GetCount(); i++) { m_ListFile.AddString(m_strFileNameArray[i]); m_strLog = _T("选择任务文件:") + m_strFileNameArray[i]; WriteLog(); } /*根据选择文件路径的长度设置控件的水平滚动条*/ SetHorizonScole(); /*显示加密按钮*/ m_BtnRun.ShowWindow(TRUE); } void CAppTemplateDlg::SetHorizonScole(void) { CString str; CSize sz; TEXTMETRIC tm; int dx = 0; CDC* pDC = m_ListFile.GetDC(); CFont* pFont = m_ListFile.GetFont(); /*获取ListBox的字体*/ CFont* pOldFont = pDC->SelectObject(pFont); /*获取字体的属性,长宽等*/ pDC->GetTextMetrics(&tm); /*获取最长字符串*/ for (int i = 0; i < m_ListFile.GetCount(); i++) { m_ListFile.GetText(i, str); sz = pDC->GetTextExtent(str); sz.cx += tm.tmAveCharWidth; if (sz.cx > dx) dx = sz.cx; } /*恢复原来字体*/ pDC->SelectObject(pOldFont); m_ListFile.ReleaseDC(pDC); /*设置列表框的水平滚动条属性*/ m_ListFile.SetHorizontalExtent(dx); } void CAppTemplateDlg::WriteLog(BOOL bType) { extern CHAR* g_szCurrentDir; CString strLog = m_strLog; /*获取当前时间*/ CTime time = CTime::GetCurrentTime(); CString strTime = time.Format(_T("%Y年%m月%d日 %H:%M:%S:")); strTime += _T(" "); if (FALSE == bType) { strTime = _T(" "); if (_T("\r\n") == m_strLog) { strTime = _T(""); } } strTime += strLog; /*\r\n是文件中的换行符*/ strTime += _T("\r\n"); CHAR buf[MAX_PATH]; ZeroMemory(buf, MAX_PATH * sizeof(CHAR)); GetASCIIArray(strTime,buf,MAX_PATH); /*打开文件*/ FILE *pFile = fopen(m_szLogFileName, "ab+"); ASSERT(NULL != pFile); /*定位到文件末尾*/ fseek(pFile, 0, SEEK_END); /*写文件*/ UINT nLen = strlen(buf); if(nLen != fwrite(buf , sizeof(CHAR), nLen, pFile)) { MessageBox(_T("Write Log File Failed!")); } /*清空文件缓存*/ fflush(pFile); /*关闭文件*/ if(EOF == fclose(pFile)) { MessageBox(_T("Close Log File Failed")); return ; } pFile = NULL; } BOOL CAppTemplateDlg::OnInitDialog() { CDialogEx::OnInitDialog(); HANDLE hCurThread = GetCurrentThread(); SetThreadPriority(hCurThread, THREAD_PRIORITY_LOWEST); this->SetWindowText(m_strTitile); SetDlgItemText(IDB_RUN, m_strRun); m_BtnRun.ShowWindow(FALSE); GetSystemInfo(&m_SysInfo); /*判断日志目录是否存在*/ CHAR dir[MAX_PATH]; sprintf(dir, "%s\\SimpleEnDecode Logs", g_szCurrentDir); if (FALSE == PathFileExistsA(dir)) { CreateDirectoryA(dir,NULL); } /*设置进度条*/ m_ProcCtrl.SetPos(0); /*判断日志文件大小是否到达警戒线*/ CHAR szFileName[MAX_PATH]; if (TRUE == m_bType) { sprintf(szFileName, "%s\\SimpleEnDecode Logs\\LogEncode.txt", dir); if (TRUE == PathFileExistsA(szFileName)) { HANDLE hFile = CreateFileA(szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ASSERT(INVALID_HANDLE_VALUE != hFile); DWORD dwHigh = 0; DWORD dwLow = 0; dwLow = GetFileSize(hFile, &dwHigh); LONGLONG llSize =dwHigh; llSize = (llSize << 32) + dwLow; CloseHandle(hFile); if (WARNING_SIZE <= llSize ) { if (IDOK == MessageBox(_T("加密日志文件大小超过1M,点确定清理,取消跳过"),NULL,MB_OKCANCEL)) { DeleteFileA(szFileName); }// end of MessageBox }//end of size compare }//end of PathFileExists } else { sprintf(szFileName, "%s\\SimpleEnDecode Logs\\LogDecode.txt", dir); if (TRUE == PathFileExistsA(szFileName)) { HANDLE hFile = CreateFileA(szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ASSERT(INVALID_HANDLE_VALUE != hFile); DWORD dwHigh = 0; DWORD dwLow = 0; dwLow = GetFileSize(hFile, &dwHigh); LONGLONG llSize =dwHigh; llSize = (llSize << 32) + dwLow; CloseHandle(hFile); if (WARNING_SIZE <= llSize ) { if (IDOK == MessageBox(_T("解密日志文件大小超过1M,点确定清理,取消跳过"),NULL,MB_OKCANCEL)) { DeleteFileA(szFileName); }//end of MessageBox }//end of size compare }//end of PathFileExists }//end of type check /*加载配置信息*/ if (ERROR_OK != LoadIni()) { this->EndDialog(ERROR_WRONGARRAY); return FALSE; } return TRUE; } void CAppTemplateDlg::EmptyAll(void) { /*清空ListBox内容*/ int nLen = m_ListFile.GetCount(); for (int i = 0; i < nLen; ) { m_ListFile.DeleteString(0); nLen = m_ListFile.GetCount(); } m_strFileNameArray.RemoveAll(); m_strErrorFileNameArray.RemoveAll(); m_strDirectory = _T(""); m_strPassword = _T(""); m_strLog = _T(""); m_strNewFileName = _T(""); m_strCurrentFile = _T(""); SetDlgItemText(IDT_TIP_FILE, _T("")); SetDlgItemText(IDT_FILENAME, _T("")); SetDlgItemText(IDT_TIP_DIR, _T("请选择文件路径")); SetDlgItemText(IDT_DIRECTORY, _T("点击下方浏览选择文件或者目录")); /*清空头部结构体*/ ZeroMemory(&m_stHeader, sizeof(HEADER)); /*以下为清空部分变量的ASCII码数组*/ ZeroMemory(m_szFileName, MAX_PATH * sizeof(CHAR)); ZeroMemory(m_szNewFileName, MAX_PATH * sizeof(CHAR)); ZeroMemory(m_szPassword, BUF_SIZE * sizeof(UCHAR)); ZeroMemory(m_szRoot, ROOT_LENTH * sizeof(CHAR)); ZeroMemory(m_szWork, BUF_SIZE * sizeof(UCHAR)); /*隐藏操作按钮*/ m_BtnRun.ShowWindow(FALSE); /*设置进度条*/ m_ProcCtrl.SetPos(0); } void CAppTemplateDlg::GetASCIIArray(CString &str, CHAR *pBuf, int nLen) { TCHAR *p = str.GetBuffer(0); ZeroMemory(pBuf, nLen * sizeof(CHAR)); #ifdef _UNICODE char *pszBuf = new char [nLen]; WideCharToMultiByte(CP_ACP, 0, p, -1,pszBuf, nLen, NULL, NULL); strncpy(pBuf, pszBuf, strlen(pszBuf)); delete pszBuf; #else strncpy(pBuf, p, strlen(p)); #endif } void CAppTemplateDlg::CreateWorkArray(void) { if (TRUE == m_strPassword.IsEmpty()) { MessageBox(_T("密码为空!")); return ; } UCHAR chSrc[BUF_SIZE]; UCHAR chDes[BUF_SIZE]; ZeroMemory(chSrc, BUF_SIZE * sizeof(UCHAR)); ZeroMemory(chDes, BUF_SIZE * sizeof(UCHAR)); UCHAR uc; size_t i = 0; int nIndex = 0; for (; i < strlen((char*)m_szPassword); i++) { chSrc[i] = m_szPassword[i]; m_szWork[i] = (UCHAR)(i & 0xff); } for (; i < BUF_SIZE ; i++) { chSrc[i] = (UCHAR)(i & 0xff); m_szWork[i] = (UCHAR)(i & 0xff); } for (i = 0; i < BUF_SIZE; i++) { int n = ((i<<4) % BUF_SIZE) + (i>>4); chDes[i] = chSrc [n]; } for (i = 0; i < BUF_SIZE; i++) { nIndex = chDes[i]; uc = m_szWork[nIndex]; m_szWork[nIndex] = m_szWork[i]; m_szWork[i] = uc; } for (i = 0; i < BUF_SIZE; i+=2) { UCHAR uc = m_szWork[i]; m_szWork[i] = m_szWork[i+1]; m_szWork[i+1] = uc; } } BOOL CAppTemplateDlg::TypeInPassword(void) { CPassword psw; if (IDCANCEL == psw.DoModal()) { MessageBox(_T("没有输入密码!")); return FALSE; } /*获取密码的ASCII码*/ GetASCIIArray(m_strPassword, (CHAR*)m_szPassword, BUF_SIZE); return TRUE; } ERROR_RET CAppTemplateDlg::OpenFiles() { m_hFileRead = CreateFileA(m_szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == m_hFileRead) { TRACE(_T("打开文件失败")); return ERROR_FILE_OPEN_FAILED; } m_hFileWrite = CreateFileA(m_szNewFileName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == m_hFileWrite) { TRACE(_T("打开文件失败")); CloseHandle(m_hFileRead); return ERROR_FILE_OPEN_FAILED; } return ERROR_OK; } ERROR_RET CAppTemplateDlg::CreateMappings() { m_hMappingRead = CreateFileMappingA(m_hFileRead, NULL, PAGE_READONLY, HIGHULONG(m_llFileSize), LOWULONG(m_llFileSize), NULL); if (NULL == m_hMappingRead) { int n = GetLastError(); CString str; str.Format(_T("Old GetLastError == %d"),n); MessageBox(str); TRACE(_T("创建文件映射失败")); CloseHandle(m_hFileRead); CloseHandle(m_hFileWrite); return ERROR_FILE_MAPPING; } m_hMappingWrite = CreateFileMappingA(m_hFileWrite, NULL, PAGE_READWRITE, HIGHULONG(m_llFileSizeNew), LOWULONG(m_llFileSizeNew), NULL); if (NULL == m_hMappingWrite) { int n = GetLastError(); CString str; str.Format(_T("New GetLastError == %d"),n); MessageBox(str); TRACE(_T("创建文件映射失败")); CloseHandle(m_hFileRead); CloseHandle(m_hFileWrite); CloseHandle(m_hMappingRead); return ERROR_FILE_MAPPING; } return ERROR_OK; } void CAppTemplateDlg::EraseFile() { SetDlgItemText(IDT_TIP_FILE, _T("擦除文件:")); HANDLE hFile = CreateFileA(m_szFileName, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ASSERT( INVALID_HANDLE_VALUE != hFile); /*if size of file is zero, set position 100*/ if (0 == m_llFileSize) { CloseHandle(hFile); DeleteFileA(m_szFileName); MoveFileA(m_szNewFileName, m_szFileName); m_ProcCtrl.SetPos(100); return ; } HANDLE hMap = CreateFileMappingA(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); ASSERT(NULL != hMap); LONGLONG llOffset = 0; DWORD dwBlock = m_SysInfo.dwAllocationGranularity * BLOCK_RATIO ; LONGLONG llCurSize = m_llFileSize; while (0 < llCurSize) { if (llCurSize < dwBlock) { dwBlock = LOWULONG(llCurSize); } CHAR *pRead = (CHAR*) MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, HIGHULONG(llOffset),LOWULONG(llOffset),dwBlock); ASSERT(NULL != pRead); for (DWORD i = 0; i < dwBlock; i++) { pRead[i] = 0; } UnmapViewOfFile(pRead); /*set process ctrl pos , when erasing file, add 50*/ LONGLONG llpos = ((m_llFileSize - llCurSize) * 100 / (m_llFileSize * 2)) + 50; m_ProcCtrl.SetPos(llpos); llOffset += dwBlock; llCurSize -= dwBlock; } m_ProcCtrl.SetPos(100); CloseHandle(hMap); CloseHandle(hFile); DeleteFileA(m_szFileName); MoveFileA(m_szNewFileName,m_szFileName); } void CAppTemplateDlg::CreatekeyPassword(UCHAR *pKey) { /*根据口令长度的奇偶性,采用不同方法加密*/ if (0 == (m_stHeader.dwPasswordLen & 0x1)) { /*密码长度是偶数*/ /*偶数位*/ for (UINT i = 0; i < BUF_SIZE; i += 2) { UCHAR ucHigh = (m_szPassword[i] >> 4) ^ (g_ucKeyArray[i] & 0xf); UCHAR ucLow = (m_szPassword[i] & 0xf) ^ (g_ucKeyArray[i] >> 4); UCHAR uc = (ucHigh << 4) + ucLow; pKey[i] = uc; } /*奇数位*/ for (UINT i = 1; i < BUF_SIZE; i +=2) { UCHAR ucHigh = (m_szPassword[i] & 0xf) ^ (g_ucKeyArray[i] >> 4); UCHAR ucLow = (m_szPassword[i] >> 4) ^ (g_ucKeyArray[i] & 0xf); UCHAR uc = (ucHigh << 4) + ucLow; pKey[i] = uc; } } else { /*密码长度是奇数*/ /*偶数位*/ for (UINT i = 0; i < BUF_SIZE; i += 2) { UCHAR ucHigh = (m_szPassword[i] & 0xf) ^ (g_ucKeyArray[i] >> 4); UCHAR ucLow = (m_szPassword[i] >> 4) ^ (g_ucKeyArray[i] & 0xf); UCHAR uc = (ucHigh << 4) + ucLow; pKey[i] = uc; } /*奇数位*/ for (UINT i = 1; i < BUF_SIZE; i +=2) { UCHAR ucHigh = (m_szPassword[i] >> 4) ^ (g_ucKeyArray[i] & 0xf); UCHAR ucLow = (m_szPassword[i] & 0xf) ^ (g_ucKeyArray[i] >> 4); UCHAR uc = (ucHigh << 4) + ucLow; pKey[i] = uc; } } } void CAppTemplateDlg::OnCancel() { if (NULL != m_pThread) { MessageBox(_T("有任务正在运行,请稍后退出")); return; } /*如果Button可见,则表示选择任务取消*/ if (TRUE == m_BtnRun.IsWindowVisible()) { m_strLog = _T("任务取消"); WriteLog(); } CDialogEx::OnCancel(); } void CAppTemplateDlg::ShowLogFile() { /*获取notepad的绝对路径*/ CHAR exe[MAX_PATH]; GetWindowsDirectoryA(exe, MAX_PATH); sprintf(exe, "%s\\Notepad.exe", exe); /*设置命令行参数*/ CHAR lpcmd[MAX_PATH]; sprintf(lpcmd, " %s", m_szLogFileName); /*设置进程启动信息*/ STARTUPINFOA si; ZeroMemory(&si,sizeof(STARTUPINFOA)); si.cb = sizeof(STARTUPINFOA); /*设置进程返回信息*/ PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); /*启动进程*/ CreateProcessA(exe,lpcmd,NULL,NULL,TRUE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&si,&pi); /*关闭进程线程句柄*/ CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } ERROR_RET CAppTemplateDlg::LoadIni() { //如果文件不存在,表示没有进行配置,返回正常 if (FALSE == PathFileExistsA(m_szAppName)) { return ERROR_OK; } else { GetPrivateProfileStringA(m_szSwitchTitle, m_szSwitchKey, "", m_szSwitchValue, 20, m_szAppName); /*如果没有开启高级配置*/ if (0 == strcmp(m_szSwitchValue, "OFF")) { /*设置状态位*/ m_bAdvSwitch = FALSE; return ERROR_OK; } /*如果开启高级配置*/ if (0 == strcmp(m_szSwitchValue, "ON")) { /*设置状态位*/ m_bAdvSwitch = TRUE; /*读取加密字符串*/ GetPrivateProfileStringA(m_szStringTitle, m_szStringKey, "", m_szStringValue, 100, m_szAppName); /*检查字符串合法性*/ for (size_t i = 0; i < strlen(m_szStringValue); i++) { if ( (m_szStringValue[i] == 'A' || m_szStringValue[i] == 'a') || (m_szStringValue[i] == 'B' || m_szStringValue[i] == 'b') || (m_szStringValue[i] == 'C' || m_szStringValue[i] == 'c') || (m_szStringValue[i] == 'D' || m_szStringValue[i] == 'd') ) { //Do Nothing continue; } else { MessageBox(_T("加密字符串不合法!")); return ERROR_ENCODESTRING; } } /*读取数组状态*/ for (int i = 0; i < 16 ; i++) { GetPrivateProfileStringA(m_szArrayTitle, m_szArrayKey[i], "", m_szArrayValue[i], 100, m_szAppName); } /*每次处理一个数的字符串*/ char buf[4]; buf[3] = '\0'; /*给随机数组赋值*/ for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { strncpy(buf, m_szArrayValue[i] + 4 * j, 3); m_Arr[i * 16 +j] = atoi(buf); } } /*检查赋值后随机数组有效性*/ for (int i = 0; i < BUF_SIZE-1; i++) { for (int j = i+1; j < BUF_SIZE; j++) { if (m_Arr[i] == m_Arr[j]) { MessageBox(_T("加密数组不合法")); return ERROR_WRONGARRAY; } } } return ERROR_OK; } /*如果既不是ON,也不是OFF,返回系统错误*/ return ERROR_SYSTEM; } }
打开目录
猜你喜欢
转载自robinsnelson.iteye.com/blog/1673157
今日推荐
周排行