// Global.cpp : 应用程序的全局变量、函数源文件 // // 代码生成在 2014年9月25日, 09:55 #include "StdAfx.h" #include "Global.h" #include // _access_s头文件; #include #include "afxcoll.h" #include "afxtempl.h" #include "atlconv.h" #include "..\\lzari.h" #include "..\helper\ffsco.h" #include #include "..\BasicExcelVC6.h" using namespace YExcel; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //#include ////////////////////////////////////////////////////////////////////////// static const int BEGIN_YEAR = 1901; static const int NUMBER_YEAR = 199; static const unsigned int LUNAR_YEARS[199] = { 0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A, //1901-1910 0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754, //1911-1920 0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E, //1921-1930 0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48, //1931-1940 0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51, //1941-1950 0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x7AD53C, //1951-1960 0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46, //1961-1970 0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50, //1971-1980 0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x093746, 0x5497BB, //1981-1990 0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645, //1991-2000 0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E, //2001-2010 0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9, //2011-2020 0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x69573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43, //2021-2030 0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C, //2031-2040 0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37, //2041-2050 0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06B244, 0x4AB638, 0x0AAE4C, 0x092E42, //2051-2060 0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B, //2061-2070 0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6, //2071-2080 0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E, //2081-2090 0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5 //2091-2099 }; ////////////////////////////////////////////////////////////////////////// // 异地选片 [4/1/2015 lyfz] ////////////////////////////////////////////////////////////////////////// BOOL g_bRemote = FALSE; ////////////////////////////////////////////////////////////////////////// HMODULE g_hlyfzMicroShareDLL = NULL; lyfzCreateShare g_lyfzCreateShare = NULL; // 升级包版本号; WORD g_arrFileVersion[4] = { 0 }; TCHAR g_szLoginUser[MAX_PATH] = _T(""); // 当前软件的登陆用户名; TCHAR g_szLoginPsw[MAX_PATH] = _T(""); // 当前软件的登陆密码; TCHAR g_szModulePath[MAX_PATH] = _T(""); // 软件目录; TCHAR g_szModuleFileName[MAX_PATH] = _T(""); // 软件全名称; TCHAR g_szConnectString[MAX_PATH] = _T(""); // DB连接串; // 主机信息; TCHAR g_szHostComputerIP[MAX_PATH] = _T(""); // 服务端主机名称; DWORD g_dwCSPort = 5678; // 服务端主机通信TCP端口; TCHAR g_szN8ViewUserDir[MAX_PATH] = {0}; // N8选版服务器用户目录(共享目录); TCHAR g_szN8ViewStsDir[MAX_PATH] = {0}; // N8选版服务器统计数据目录(共享目录); TCHAR g_szN8ViewProductDir[MAX_PATH] = {0}; // N8选版产品配置目录(共享目录); DWORD g_dwSoftRunTime = 0; // 软件剩余可运行时间; // 数据库信息; TCHAR g_szDBSource[MAX_PATH] = _T(""); // 数据库源(服务所在IP或计算机名); TCHAR g_szDBSourcePort[MAX_PATH] = _T(""); // 数据库源端口; DWORD g_dwDBServerPort = 0; // 数据库源端口; TCHAR g_szDBAccount[MAX_PATH] = _T(""); // 数据库登录用户; TCHAR g_szDBPassWord[MAX_PATH] = _T(""); // 数据库登录密码; TCHAR g_szDBName[MAX_PATH] = _T(""); // 数据库名称; // 相片存储目录; TCHAR g_szShareHost[MAX_PATH] = _T(""); // 共享主机名; TCHAR g_szOriginalFolder[MAX_PATH] = _T(""); // 原片目录; TCHAR g_szOriginalBkFolder[MAX_PATH] = _T(""); // 原片备份目录; TCHAR g_szEarlyRepairFolder[MAX_PATH] = _T(""); // 初修片目录; TCHAR g_szEarlyRepairBkFolder[MAX_PATH] = _T(""); // 初修片备份目录; TCHAR g_szFurtherRepairFolder[MAX_PATH] = _T(""); // 精修片目录; TCHAR g_szFurtherRepairBkFolder[MAX_PATH] = _T(""); // 精修片备份目录; TCHAR g_szDesignFolder[MAX_PATH] = _T(""); // 设计片目录; TCHAR g_szDesignBkFolder[MAX_PATH] = _T(""); // 设计片备份目录; TCHAR g_szTelRecordingFolder[MAX_PATH] = _T(""); // 电话录音目录; TCHAR g_szFullDressImageFolder[MAX_PATH] = _T(""); // 礼服图片目录; TCHAR g_strCPUID[MAX_PATH] = _T(""); //获取CPU ID TCHAR g_strMacAddr[MAX_PATH] = _T(""); //mac地址 TCHAR g_strHDNum[MAX_PATH] = _T(""); //硬盘ID TCHAR g_strBIOSNum[MAX_PATH] = _T(""); //主板ID BOOL g_bRunOnCorruptdb = FALSE; // 在损坏的数据库上运行; // 软件所用加密狗是否已注册; // Jeff,应该放在SoftKey做为静态变量使用; BOOL g_bSoftWareReg = FALSE; // 加密狗中的字符信息S1:如 201409062003558789.ly.com // 该全局变量在旧软件名称是:g_sdomain; // 该变量在数据库表字段[path].[path1]中存储; CString g_strDogMainInfo = ""; // 未知用途; // 该全局变量在旧软件中名称是:CString g_bMain; // 与集团版有关联性; // 有可能是主店名称; CString g_strMain = ""; // 分店名称数组;旧软件中名称:g_branchnamearray CStringArray g_strArrayOfBranchName; // ?? CStringArray g_strArrayOfBranchName2; // 分店IP地址数组; CStringArray g_strArrayOfBranchIPAdress; // 分店的加密狗S1信息数组; CStringArray g_strArrayOfBranchDogMainInfo; // 座席版允许连接数(从加密狗中获取); unsigned int g_nCountOfAllowToConn = 0; #ifdef USE_KERNEL_DLL // 本店设置信息;用于集团版连接时,回访本店信息时用; TblVersion g_ThisShopVersion; HINSTANCE g_Instance = NULL; #endif DWORD g_nLeng = 0; BYTE *g_pData = NULL; DWORD g_nLeng2 = 0; BYTE *g_pData2 = NULL; SENDHEAD g_sendhead; BOOL g_bRedSkin = 0; COLORREF g_gridcol1 = RGB(204, 204, 204); COLORREF g_gridcol2 = RGB(190, 190, 190); COLORREF g_bkcol = RGB(184, 184, 184); CString g_date; CString g_title; CArrayg_userarray; CArrayg_cominfoarray; CArrayg_cominfoarraylocal; CArrayg_lengarray; CArrayg_btnlengarray; CArrayg_pointerarray; CBrush g_editbkbrush; DWORD g_btnleng[8]; int g_btnlengpos = -1; int g_nYearpos = -1; CString g_branchname = ""; // Jeff.集团版:????本分店名称; CString g_branchip = ""; CString g_branchip2 = ""; BOOL g_bBranchModify = 0; BOOL g_bShowOK = 0; // 取件OK的订单; BOOL g_bStaffAchievementShow = 0; // 此机用于员工业绩查看; BOOL g_bSaveUploadTask1 = 0; BOOL g_bSaveUploadTask2 = 0; BOOL g_bSaveUploadTask3 = 0; BOOL g_bSaveUploadTask4 = 0; BOOL g_bSearchFilter = 0; CString g_waiter1; CString g_waiter2; CString g_waiter3; CString g_waiter4; CString g_waiter5; CString g_filterdate1; CString g_filterdate2; CString g_filterdate3; CString g_filterdate4; CString g_filterdate5; CString g_filterdate6; CString g_filterbranch; USER g_user; CString g_mainpath; // 软件目录 CString g_id; // CString g_server; // 服务端地址 CStringArray g_serverarray; // CString g_serverbak; // CString g_path1; /* 共享目录 <客户原片(管理软件)$> 如:"\\lyfz-pc\客户原片(管理软件)$" */ CString g_path2; /* 共享目录 <修好的片(管理软件)$> 如:"\\lyfz-pc\修好的片(管理软件)$" */ CString g_path3; /* 共享目录 <设计好的片(管理软件$)> 如:""> */ CString g_path4; /* 共享目录 <精修好的片(管理软件$)> 如:""> */ CString g_path5; /* 共享目录 <礼服图片(管理软件$)> 如:""> */ CString g_path6; /* 共享目录 <电话录音(管理软件$)> 如:""> */ CString g_path7; /* 共享目录 <客户原片(管理软件$)\效果图> 如:""> */ CString g_path1bak; CString g_path2bak; CString g_path3bak; CString g_path4bak; CString g_path5bak; CString g_path6bak; CString g_path7bak; CDatabase g_db; DWORD g_ncount; CFont g_titlefont; DWORD g_nSendCode = 0; BOOL g_bSendOK = 0; CString g_temp; CArrayg_hisyeararray; CArrayg_brancharray; CArrayg_oldclientarray; BOOL g_bNoConnDlg = 0; BOOL g_bInSkin = 0; BOOL g_bGenBranchData = 0; BOOL g_bSortAscending = FALSE; CFont g_listctrlfont; float g_fscalex; // x坐标刻度 float g_fscaley; // y坐标刻度 int g_screenwid; // 桌面宽 int g_screenhei; // 桌面高 float g_WidthScale2 = 1; float g_HeightScale2 = 1; RESDATA2 g_resdata2; BOOL g_bAlphaWnd = 0; BYTE g_bNeedDrawParent = 0; BOOL g_bAllBranch = 0; CString g_domain; CString g_sInfo; int g_ncot = 0; // Jeff:订单总数(包含历史订单在内),该变量作用是当订单总数大于1000时,向公司服务器发送数据; int g_conpos = 0; int g_nAutoShowStaffAchievement = -1; BOOL g_bShowBar = 1; int g_bookingtype = 0; BOOL g_bNoLoginLia = 0; BOOL g_bConnLYFZ = 0; BOOL g_bSendLYFZ = 0; int g_ntimeout = 29000; float g_WidthScale; float g_HeightScale; int g_dx = 0; int g_dy = 0; BOOL g_bNeedCoon = 1; // remark by Jeff:是否需要重新连接服务端; CStringArray g_menubranchname; CArrayg_List1array; #if USE_SHARE_FLORD CArray g_aryOfSharePathInfo; // NetShareInfo表记录; #endif /************************************************************************/ /* Jeff:g_conntype g_conntype == 0 :表示正常连接?(或是连接本地服务器?) g_conntype == 1 :表示连接公司服务器(http://lijiafz.vicp.net) g_conntype == 2 :http://www.lyfz.net/download/ip.txt g_conntype == 3 :http://photo.bjlyfz.com/download/ip.txt g_conntype == 4 : */ /************************************************************************/ int g_conntype = 0; // 正常; // 使用系统数字命名; BOOL g_bOriginal = FALSE; // 客户端guid值; TCHAR g_szGuidMark[64] = {0}; // 控制台输出; BOOL g_bStdOut = FALSE; // N8安装路径; TCHAR g_szN8Path[MAX_PATH] = _T(""); // HostInfo.ini的路径; TCHAR g_szIniPath[MAX_PATH] = _T(""); // N8选版服务器IP地址; TCHAR g_szN8SvIP[MAX_PATH] = _T(""); // 是否启用云选功能; BOOL g_bEnableClound = FALSE; // 是否导出条形码位图; BOOL g_bExportBarCode = FALSE; // 侧边栏抽屉数量; INT g_nDrawerCount = 12; //0 正常 //1 连接1 //2 连接2 //3 连接3 //4 连接4 //************************************// // 数据库地址; // 数据库端口; // 数据库管理员账号; // 数据库管理员密码; // 数据库名称; // // [函数]:GetIniInfo // [描述]:获取指定ini信息; // [参数]: // szPath:ini所在目录; // szIniName:ini名; // [返回]:void //************************************// int GetSysIniInfo(const char *szPath, const char *szIniName) { TCHAR szDrive[_MAX_DRIVE] = { 0 }; TCHAR szDir[_MAX_DIR] = { 0 }; TCHAR szFna[_MAX_DIR] = { 0 }; TCHAR szExt[_MAX_DIR] = { 0 }; ::GetModuleFileName(NULL, g_szModuleFileName, sizeof(g_szModuleFileName) / sizeof(TCHAR)); #ifdef VC60 sprintf(g_szModulePath, _T("%s"), g_szModuleFileName); _tsplitpath(g_szModulePath, szDrive, szDir, szFna, szExt); _tcscpy(g_szModulePath, szDrive); _tcscat(g_szModulePath, szDir); #else _stprintf_s(g_szModulePath, MAX_PATH, _T("%s"), g_szModuleFileName); _tsplitpath_s(g_szModulePath, szDrive, _MAX_DRIVE, szDir, _MAX_DIR, szFna, _MAX_DIR, szExt, _MAX_DIR); _tcscpy_s(g_szModulePath, MAX_PATH, szDrive); _tcscat_s(g_szModulePath, MAX_PATH, szDir); #endif // -----------------------------------------------------// if (szPath != NULL && szIniName != NULL) { if ( szPath[strlen(szPath) -1] == '\\' ) wsprintf(g_szIniPath, _T("%s%s"), szPath, szIniName); else wsprintf(g_szIniPath, _T("%s\\%s"), szPath, szIniName); if ( !PathFileExists(g_szIniPath) ) { wsprintf(g_szIniPath, _T("%sHostInfo.ini"), g_szModulePath); } } else { wsprintf(g_szIniPath, _T("%sHostInfo.ini"), g_szModulePath); } printf("szFile =%s\n", g_szIniPath); HANDLE hFile = CreateFile(g_szIniPath, 0/*GENERIC_READ*/, 0, NULL, OPEN_EXISTING, 0, NULL); if (ERROR_FILE_NOT_FOUND == GetLastError()) { printf("没有找到配置文件[%s]\n", g_szIniPath); // 不存在则创建; CFile fp; if( fp.Open(g_szIniPath,CFile::modeCreate|CFile::modeWrite) ) { fp.Close(); } WritePrivateProfileString(_T("NetWorkInfo"),_T("Host"),_T("127.0.0.1"),g_szIniPath); WritePrivateProfileString(_T("NetWorkInfo"),_T("CSPort"),_T("5678"),g_szIniPath); return -1; } CloseHandle(hFile); hFile = NULL; // 获取服务器端TCP信息; GetPrivateProfileString(_T("NetWorkInfo"), _T("Host"), _T(""), g_szHostComputerIP, MAX_PATH, g_szIniPath); // N8选版程序路径; GetPrivateProfileString(_T("NemoInfo"), _T("N8Path"), _T(""), g_szN8Path, MAX_PATH, g_szIniPath); // N8选版服务器IP; //GetPrivateProfileString(_T("NemoInfo"), _T("N8SvIP"), _T(""), g_szN8SvIP, MAX_PATH, g_szIniPath); g_dwCSPort = GetPrivateProfileInt(_T("NetWorkInfo"), _T("CSPort"), 0, g_szIniPath); g_ntimeout = GetPrivateProfileInt(_T("NetWorkInfo"), _T("TimeOut"), 30000, g_szIniPath); g_bRunOnCorruptdb = GetPrivateProfileInt(_T("SystemInfo"), _T("RunOnCorruptdb"), 0, g_szIniPath); if ( !g_bStdOut ) { g_bStdOut = GetPrivateProfileInt(_T("NetWorkInfo"), _T("StdOut"), 0, g_szIniPath); if ( g_bStdOut ) { AllocConsole(); // 开辟控制台; SetConsoleTitle(_T("lyfz调试输出")); // 设置控制台窗口标题; freopen("CONOUT$", "w+t", stdout); // 重定向输出; freopen("CONIN$", "r+t", stdin); // 重定向输入; HWND hWnd = NULL; again: hWnd = ::FindWindow(NULL, _T("lyfz调试输出")); if( hWnd ) { if (!::SetWindowPos(hWnd, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE)) { printf(_T("前置设置失败\n")); } else { printf(_T("前置设置成功\n")); } } else { goto again; } } } return 0; } //---------------------------------------------------------- // 函数:IsFileExist // 描述:判断某文件是否存在; // 参数: // pFileFullName: 指定的文件名; // 返回:TRUE表示文件存在; //---------------------------------------------------------- BOOL IsFileExist(const TCHAR *pFileFullName) { int err = 0; // Check for existence. if ((err = _access(pFileFullName, 0)) == 0) { //printf_s( "File crt_access_s.c exists.\n" ); // Check for write permission. if ((err = _access(pFileFullName, 2)) == 0) { //printf_s( "File crt_access_s.c does have ""write permission.\n" ); } else { //printf_s( "File crt_access_s.c does not have ""write permission.\n" ); } } else { //printf_s( "File crt_access_s.c does not exist.\n" ); return FALSE; } return TRUE; } // Pump messages while waiting for event //---------------------------------------------------------- // 函数:WaitWithMessageLoop // 描述:等待某内核事件触发; // 参数: // hEvent: 被等待响应的内核事件对象; // nTimeout: 超时值; // 返回:TRUE返回触发成功; //---------------------------------------------------------- BOOL WaitWithMessageLoop(HANDLE hEvent, int nTimeout) { DWORD dwRet = 0; while (1) { // wait for event or message, if it's a message, process it and return to waiting state dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, nTimeout, QS_ALLINPUT); if (dwRet == WAIT_OBJECT_0) { TRACE0("WaitWithMessageLoop() event triggered.\n"); return TRUE; } else if (dwRet == WAIT_OBJECT_0 + 1) { // process window messages AfxGetApp()->PumpMessage(); } else if (dwRet == WAIT_TIMEOUT) { // timed out ! return FALSE; } else { // WAIT_ABANDONED_0 ... return TRUE; } } } //---------------------------------------------------------- // 函数:DeleteDirectory // 描述:删除指定目录下的所有文件; // 参数:strDir:指定要删除的文件目录; // 返回:; //---------------------------------------------------------- void DeleteDirectory(CString strDir) { try { // 首先删除文件及子文件夹 CFileFind ff; BOOL bFound = ff.FindFile(strDir + "\\*", 0); while (bFound) { bFound = ff.FindNextFile(); if (ff.GetFileName() == "." || ff.GetFileName() == "..") continue; // 去掉文件(夹)只读等属性 SetFileAttributes(ff.GetFilePath(), FILE_ATTRIBUTE_NORMAL); if (ff.IsDirectory()) { // 递归删除子文件夹 DeleteDirectory(ff.GetFilePath()); RemoveDirectory(ff.GetFilePath()); } else { DeleteFile(ff.GetFilePath()); // 递归 删除文件 } } ff.Close(); // 然后删除该文件夹 RemoveDirectory(strDir); } catch (...) { //WriteLogin("出错在函数deldir中"); } // int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp ); } // Jeff.注册控件函数;2014.09.11 //---------------------------------------------------------- // 函数:RegisterOcx // 描述:注册指定的组件文件; // 参数:ocxfile指定要注册的组件文件名; // 返回:TRUE表示注册成功; //---------------------------------------------------------- BOOL RegisterOcx(LPCTSTR ocxfile) { HKEY hKey; bool bRet; USES_CONVERSION; ITypeLib* pTypeLib; CString CLSIDStr; CLSID clsid; LPOLESTR wRes = NULL; if (LoadTypeLib(T2OLE(ocxfile), &pTypeLib) == S_OK) { TLIBATTR tlibAttr, *ptlibAttr; ptlibAttr = &tlibAttr; pTypeLib->GetLibAttr(&ptlibAttr); clsid = ptlibAttr->guid; pTypeLib->Release(); } ::StringFromCLSID(clsid, &wRes); CLSIDStr = OLE2CT(wRes); if ((RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID\\" + CLSIDStr, 0, KEY_READ, &hKey) == ERROR_SUCCESS) || (RegOpenKeyEx(HKEY_CLASSES_ROOT, "Wow6432Node\\TypeLib\\" + CLSIDStr, 0, KEY_READ, &hKey) == ERROR_SUCCESS)) { return true; } else { HINSTANCE hLib = LoadLibrary(ocxfile); if (hLib < (HINSTANCE)HINSTANCE_ERROR) { MessageBox(0, "权限不足,不能载入OCX文件!无法注册控件!", "结果", MB_OK); bRet = false; } else { FARPROC lpDllEntryPoint; lpDllEntryPoint = GetProcAddress(hLib, _T("DllRegisterServer")); if (lpDllEntryPoint != NULL) { if (FAILED((*lpDllEntryPoint)())) { MessageBox(0, "调用注册函数(DllRegisterServer)失败!无法注册控件!", "结果", MB_OK); bRet = false; } else bRet = true; } else { MessageBox(0, "调用注册函数(DllRegisterServer)失败!无法注册控件!", "结果", MB_OK); bRet = false; } } FreeLibrary(hLib); return bRet; } } // Jeff.Hacker. WINDOWS NT 以上的内核需要提权,才能对系统进行高级管理; //---------------------------------------------------------- // 函数:GetDebugPriv // 描述:对程序提权; // 参数: // 返回:TRUE表示程序提权成功; //---------------------------------------------------------- BOOL GetDebugPriv() { // 返回的访问令牌指针; HANDLE hToken; // 接收所返回的制定特权名称的信息; LUID sedebugnameValue; // 新特权信息的指针(结构体); TOKEN_PRIVILEGES tkp; DWORD dwCurProcId = GetCurrentProcessId(); // 要修改访问权限的进程句柄; HANDLE hCurProc; hCurProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwCurProcId); if (!::OpenProcessToken(hCurProc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { ShowSystemErrorInfo(CString("提权OpenProcessToken失败。"), GetLastError()); return FALSE; } if (!::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) { ShowSystemErrorInfo(CString("提权LookupPrivilegeValue失败。"), GetLastError()); CloseHandle(hToken); return FALSE; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = sedebugnameValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!::AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL)) { ShowSystemErrorInfo(CString("提权AdjustTokenPrivileges失败。"), GetLastError()); CloseHandle(hToken); return FALSE; } CloseHandle(hCurProc); CloseHandle(hToken); return TRUE; } //---------------------------------------------------------- // 函数:GetFileVersion // 描述:获取指定模块的文件版本信息 // 参数: // hModule: 指定的模块(如果为NULL,表示获取自身文件版本信息); // pBuffer: 返回的文件版本信息; // // 返回:TRUE表示获取模块文件版本信息成功; //---------------------------------------------------------- bool GetFileVersion(HMODULE hModule, WORD *pBuffer) { TCHAR fname[MAX_PATH]; VS_FIXEDFILEINFO *pVi; DWORD dwHandle; std::string str; if (::GetModuleFileName(hModule, fname, MAX_PATH)) { int size = GetFileVersionInfoSize(fname, &dwHandle); if (size > 0) { BYTE *buffer = new BYTE[size]; memset(buffer, 0, size); if (GetFileVersionInfo(fname, dwHandle, size, buffer)) { if (VerQueryValue(buffer, _T("\\"), (LPVOID *)&pVi, (PUINT)&size)) { pBuffer[0] = HIWORD(pVi->dwFileVersionMS); pBuffer[1] = LOWORD(pVi->dwFileVersionMS); pBuffer[2] = HIWORD(pVi->dwFileVersionLS); pBuffer[3] = LOWORD(pVi->dwFileVersionLS); delete buffer; return true; } } delete buffer; } } return false; } //---------------------------------------------------------- // GetProductVersion // 描述:获取指定模块的文件版本信息 // 参数: // hModule: 指定的模块(如果为NULL,表示获取自身文件版本信息); // pBuffer: 返回的文件版本信息; // // 返回:TRUE表示获取模块文件版本信息成功; //---------------------------------------------------------- bool GetProductVersion(IN HMODULE hModule, OUT WORD *pBuffer) { TCHAR fname[MAX_PATH] = {0}; VS_FIXEDFILEINFO *pVi = NULL; DWORD dwHandle = 0; string str; if (::GetModuleFileName(hModule, fname, MAX_PATH)) { int size = GetFileVersionInfoSize(fname, &dwHandle); if (size > 0) { BYTE *buffer = new BYTE[size]; memset(buffer,0,size); if (GetFileVersionInfo(fname, dwHandle, size, buffer)) { if (VerQueryValue(buffer, _T("\\"), (LPVOID *)&pVi, (PUINT)&size)) { pBuffer[0] = HIWORD(pVi->dwProductVersionMS); pBuffer[1] = LOWORD(pVi->dwProductVersionMS); pBuffer[2] = HIWORD(pVi->dwProductVersionLS); pBuffer[3] = LOWORD(pVi->dwProductVersionLS); delete []buffer; return true; } } delete []buffer; } } return false; } //---------------------------------------------------------- // 函数:CheckInternalIP // 描述:判断IP(网络字节序)地址是否为外网地址; // 参数:ip_addr:主机IP(必须为网络字节序); // // 返回:TRUE表示主机IP为外网IP; FALSE表示内网IP; //---------------------------------------------------------- BOOL CheckInternalIPV4(const unsigned int &ip_addr) { // 三段保留IP段,做为私有地址,不在在公网上使用,只作内网IP; // A类:10.0.0.0 ~ 10.255.255.255 = 0A.00.00.00 ~ 0A.FF.FF.FF // B类:172.16.0.0 ~ 172.31.255.255 = AC.10.00.00 ~ AC.1F.FF.FF // C类:192.168.0.0 ~ 192.168.255.255 = C0.A8.00.00 ~ C0.A8.FF.FF // D类:127.0.0.0 ~ 127.255.255.255 = 7F.00.00.00 ! 7F.FF.FF.FF (环回地址) #if 0 //检查3类地址是否属于公网; if ((ip_addr >= 0x0A000000 && ip_addr <= 0x0AFFFFFF) || (ip_addr >= 0xAC100000 && ip_addr <= 0xAC1FFFFF) || (ip_addr >= 0xC0A80000 && ip_addr <= 0xC0A8FFFF) ) { return FALSE; } return TRUE; #endif #if 0 //检查3类地址是否属于内网; // 0xa -- "10.0.0.0">>24; // 0xc0a8--"192.168.0.0.">>16; // 0x2b0--"127.17.0.1">>22 if ((ip_addr >> 24 == 0xa) || (ip_addr >> 16 == 0xc0a8) || (ip_addr >> 22 == 0x2b0)) return FALSE; else return TRUE; #endif #if 1 // 回环地址也算进去! if ((ip_addr >> 24 == 0x0A) || (ip_addr >> 20 == 0xAC1) || (ip_addr >> 16 == 0xC0A8) || (ip_addr >> 26 == 0x7)) return FALSE; else return TRUE; #endif } //---------------------------------------------------------- // 函数:IsValidIPV4 // 描述:判断字符串是否是有效的IPV4; // 参数:szIP:主机IP; // // 返回:TRUE表示字符串为有效的IPV4; //---------------------------------------------------------- BOOL IsValidIPV4(const TCHAR *szIP) { int nIndex = 0; int nPointCount = 0; // "."IPV4有3个; int nLen = strlen(szIP); for (int i = 0; i < nLen; i++) { if (szIP[i] == '.') { if (i == 0 || i == nLen - 1) { return FALSE; } else { if (++nIndex != i) { nIndex = i; nPointCount++; } else return FALSE; } continue; } if (isdigit(szIP[i]) == 0) return FALSE; } if (nPointCount != 3) return FALSE; return TRUE; } //---------------------------------------------------------- // 函数:GetHostAllOfIP // 描述:返回指定主机名称的所有IPV4地址; // 参数: // pHostName: 主机名; // vtHostIPV4:指定主机名的所有IPV4地址; // // 返回:TRUE表示字符串为有效的IPV4; //---------------------------------------------------------- int GetHostAllOfIP(const TCHAR *pHostName, std::vector &vtHostIPV4) { #if 0 WSADATA wsa = { 0 }; WSAStartup(MAKEWORD(2, 2), &wsa); #endif #if 0 // YLGL项目使用不了,因为包含了旧的系统头文件; addrinfo hint, *answer, *curr; memset(&hint, 0, sizeof(addrinfo)); hint.ai_family = AF_INET; hint.ai_socktype = SOCK_STREAM; int nRet = GetAddrInfo(pHostName, NULL, &hint, &answer); //int nRet = GetAddrInfo(pHostName, "5678", &hint, &answer); if (nRet != 0) { DWORD dwError = GetLastError(); return; } TCHAR szIP[MAX_PATH]; for (curr = answer; curr != NULL; curr = curr->ai_next) { //std::string ipstr; memset(szIP, 0, MAX_PATH); _inet_ntop(AF_INET, &(((sockaddr_in*)(curr->ai_addr))->sin_addr), szIP, MAX_PATH); vtHostIPV4.push_back(szIP); } freeaddrinfo(answer); #endif return 0; } void DataToArray(CArray*pArrayOfString, int datapos) { try { pArrayOfString->RemoveAll(); if (g_nLeng == 0) { return; } // 1.code[0]数组:用作发送时,存储着操作指令;用作接收时,存储着接收数据大小???; if (g_sendhead.code[0]) { // 1.1.将g_pData全局变量里保存的数据进行解压,并存储在lpszOut数组里; BYTE *lpszOut = NULL; int nOutSize = 0; LZARI Lzari; #ifdef VC60 Lzari.UnCompress(g_pData, g_nLeng, lpszOut, nOutSize); #else Lzari.UnCompress(g_pData, g_nLeng, (const BYTE*&)lpszOut, nOutSize); #endif // 1.2.将解压后的数据lpszOut附加到内存文件里; CMemFile memfile; memfile.Attach(lpszOut, nOutSize); Lzari.Release(); // 1.3.将内存文件序列化保存到CArchive对象里; CArchive ar(&memfile, CArchive::load); pArrayOfString->SetSize(g_sendhead.count[0]); // 1.4.将CArchive对象里的数据,序列化到指定的CArray对象里; for (int ii = 0; ii < pArrayOfString->GetSize(); ii++) { pArrayOfString->ElementAt(ii).Serialize(ar); } // 1.5.完成数据的导出任务,释放内存; ar.Close(); memfile.Detach(); } else { CMemFile memfile; memfile.Attach(g_pData, g_nLeng); CArchive ar(&memfile, CArchive::load); pArrayOfString->SetSize(g_sendhead.count[0]); for (int ii = 0; ii < pArrayOfString->GetSize(); ii++) { pArrayOfString->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } } catch (...) { } } void DataToArray( CArray*pArrayOfString1, CArray*pArrayOfString2, int datapos) { try { CArray*parray[2] = { pArrayOfString1, pArrayOfString2 }; DWORD bytereads = 0; for (int i = 0; i < 2; i++) { parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0) continue; if (g_sendhead.code[i]) { // 1.1.将g_pData全局变量里保存的数据进行解压,并存储在lpszOut数组里; BYTE *lpszOut = NULL; int nOutSize = 0; LZARI Lzari; #ifdef VC60 Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize); #else Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], (const BYTE*&)lpszOut, nOutSize); #endif // 1.2.将解压后的数据lpszOut附加到内存文件里; CMemFile memfile; memfile.Attach(lpszOut, nOutSize); Lzari.Release(); // 1.3.将内存文件序列化保存到CArchive对象里; bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); // 1.4.将CArchive对象里的数据,序列化到指定的CArray对象里; for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } // 1.5.完成数据的导出任务,释放内存; ar.Close(); memfile.Detach(); } else { CMemFile memfile; memfile.Attach(g_pData + bytereads, g_sendhead.length[i]); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } } } catch (...) { } } void DataToArray( CArray*pArrayOfString1, CArray*pArrayOfString2, CArray*pArrayOfString3, int datapos) { try { CArray*parray[3] = { pArrayOfString1, pArrayOfString2, pArrayOfString3 }; DWORD bytereads = 0; for (int i = 0; i < 3; i++) { parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0)continue; if (g_sendhead.code[i]) { BYTE *lpszOut = NULL; int nOutSize = 0; LZARI Lzari; #ifdef VC60 Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize); #else Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], (const BYTE*&)lpszOut, nOutSize); #endif CMemFile memfile; memfile.Attach(lpszOut, nOutSize); Lzari.Release(); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } else { CMemFile memfile; memfile.Attach(g_pData + bytereads, g_sendhead.length[i]); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } } } catch (...) { } } void DataToArray( CArray*pArrayOfString1, CArray*pArrayOfString2, CArray*pArrayOfString3, CArray*pArrayOfString4, int datapos) { try { CArray*parray[4] = { pArrayOfString1, pArrayOfString2, pArrayOfString3, pArrayOfString4 }; DWORD bytereads = 0; for (int i = 0; i < 4; i++) { parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0)continue; if (g_sendhead.code[i]) { BYTE *lpszOut = NULL; int nOutSize = 0; LZARI Lzari; #ifdef VC60 Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize); #else Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], (const BYTE*&)lpszOut, nOutSize); #endif CMemFile memfile; memfile.Attach(lpszOut, nOutSize); Lzari.Release(); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } else { CMemFile memfile; memfile.Attach(g_pData + bytereads, g_sendhead.length[i]); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } } } catch (...) { } } void DataToArray( CArray*pArrayOfString1, CArray*pArrayOfString2, CArray*pArrayOfString3, CArray*pArrayOfString4, CArray*pArrayOfString5, int datapos) { try { CArray*parray[5] = { pArrayOfString1, pArrayOfString2, pArrayOfString3, pArrayOfString4, pArrayOfString5 }; DWORD bytereads = 0; for (int i = 0; i < 5; i++) { parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0) continue; if (g_sendhead.code[i]) { BYTE *lpszOut = NULL; int nOutSize = 0; LZARI Lzari; #ifdef VC60 Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize); #else Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], (const BYTE*&)lpszOut, nOutSize); #endif CMemFile memfile; memfile.Attach(lpszOut, nOutSize); Lzari.Release(); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } else { CMemFile memfile; memfile.Attach(g_pData + bytereads, g_sendhead.length[i]); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } } } catch (...) { } } void DataToArray( CArray*pArrayOfString1, CArray*pArrayOfString2, CArray*pArrayOfString3, CArray*pArrayOfString4, CArray*pArrayOfString5, CArray*pArrayOfString6, int datapos) { try { CArray*parray[6] = { pArrayOfString1, pArrayOfString2, pArrayOfString3, pArrayOfString4, pArrayOfString5, pArrayOfString6 }; DWORD bytereads = 0; for (int i = 0; i < 6; i++) { parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0)continue; if (g_sendhead.code[i]) { BYTE *lpszOut = NULL; int nOutSize = 0; LZARI Lzari; #ifdef VC60 Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize); #else Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], (const BYTE*&)lpszOut, nOutSize); #endif CMemFile memfile; memfile.Attach(lpszOut, nOutSize); Lzari.Release(); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } else { CMemFile memfile; memfile.Attach(g_pData + bytereads, g_sendhead.length[i]); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } } } catch (...) { } } void DataToArray( CArray*pArrayOfString1, CArray*pArrayOfString2, CArray*pArrayOfString3, CArray*pArrayOfString4, CArray*pArrayOfString5, CArray*pArrayOfString6, CArray*pArrayOfString7, int datapos) { try { CArray*parray[7] = { pArrayOfString1, pArrayOfString2, pArrayOfString3, pArrayOfString4, pArrayOfString5, pArrayOfString6, pArrayOfString7 }; DWORD bytereads = 0; for (int i = 0; i < 7; i++) { parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0)continue; if (g_sendhead.code[i]) { BYTE *lpszOut = NULL; int nOutSize = 0; LZARI Lzari; #ifdef VC60 Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize); #else Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], (const BYTE*&)lpszOut, nOutSize); #endif CMemFile memfile; memfile.Attach(lpszOut, nOutSize); Lzari.Release(); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } else { CMemFile memfile; memfile.Attach(g_pData + bytereads, g_sendhead.length[i]); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } } } catch (...) { } } void DataToArray( CArray*pArrayOfString1, CArray*pArrayOfString2, CArray*pArrayOfString3, CArray*pArrayOfString4, CArray*pArrayOfString5, CArray*pArrayOfString6, CArray*pArrayOfString7, CArray*pArrayOfString8, int datapos) { try { CArray*parray[8] = { pArrayOfString1, pArrayOfString2, pArrayOfString3, pArrayOfString4, pArrayOfString5, pArrayOfString6, pArrayOfString7, pArrayOfString8 }; DWORD bytereads = 0; for (int i = 0; i < 8; i++) { parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0)continue; if (g_sendhead.code[i]) { BYTE *lpszOut = NULL; int nOutSize = 0; LZARI Lzari; #ifdef VC60 Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize); #else Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], (const BYTE*&)lpszOut, nOutSize); #endif CMemFile memfile; memfile.Attach(lpszOut, nOutSize); Lzari.Release(); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } else { CMemFile memfile; memfile.Attach(g_pData + bytereads, g_sendhead.length[i]); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } } } catch (...) { } } void DataToArray( CArray*pArrayOfString1, CArray*pArrayOfString2, CArray*pArrayOfString3, CArray*pArrayOfString4, CArray*pArrayOfString5, CArray*pArrayOfString6, CArray*pArrayOfString7, CArray*pArrayOfString8, CArray*pArrayOfString9, CArray*pArrayOfString10, int datapos) { try { CArray*parray[10] = { pArrayOfString1, pArrayOfString2, pArrayOfString3, pArrayOfString4, pArrayOfString5, pArrayOfString6, pArrayOfString7, pArrayOfString8, pArrayOfString9, pArrayOfString10 }; DWORD bytereads = 0; for (int i = 0; i < 10; i++) { parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0)continue; if (g_sendhead.code[i]) { BYTE *lpszOut = NULL; int nOutSize = 0; LZARI Lzari; #ifdef VC60 Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize); #else Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], (const BYTE*&)lpszOut, nOutSize); #endif CMemFile memfile; memfile.Attach(lpszOut, nOutSize); Lzari.Release(); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } else { CMemFile memfile; memfile.Attach(g_pData + bytereads, g_sendhead.length[i]); bytereads += g_sendhead.length[i]; CArchive ar(&memfile, CArchive::load); parray[i]->SetSize(g_sendhead.count[i]); for (int ii = 0; ii < parray[i]->GetSize(); ii++) { parray[i]->ElementAt(ii).Serialize(ar); } ar.Close(); memfile.Detach(); } } } catch (...) { } } ////////////////////////////////////////////////////////////////////////// // Image版本; BOOL LoadImageFromFile(IN Image** pImg, IN CString strPath) { if ( !PathFileExists(strPath) ) return FALSE; if ( *pImg ) delete *pImg; *pImg = NULL; #ifdef UNICODE *pImg = Image::FromFile(strPath); #else BSTR strtmp = _bstr_t(strPath); *pImg = Image::FromFile(strtmp); SysFreeString(strtmp); #endif return TRUE; } BOOL LoadImageFromBuf(IN Image** pImg, IN CString strPath) { if ( !PathFileExists(strPath) ) return FALSE; if ( *pImg ) delete *pImg; *pImg = NULL; CFile fp; CFileException e; BOOL bRet = FALSE; if ( fp.Open(strPath, CFile::modeRead, &e)) { DWORD dwLength = (DWORD)fp.GetLength(); BYTE *pData = new BYTE[dwLength]; fp.Read(pData,dwLength); fp.Close(); bRet = LoadImageFromBuf(pImg, pData, dwLength); if( pData ) delete []pData; } return bRet; } BOOL LoadImageFromBuf(IN Image** pImg, IN BYTE* pBuffer, IN CONST DWORD& nBufLen) { if ( pBuffer == NULL ) return FALSE; if ( *pImg ) delete *pImg; *pImg = NULL; HGLOBAL hMemery = GlobalAlloc(GMEM_MOVEABLE, nBufLen); if ( hMemery == NULL ) return FALSE; BYTE *pMem = (BYTE*)GlobalLock(hMemery); memcpy(pMem, pBuffer, nBufLen); IStream *pstream = NULL; CreateStreamOnHGlobal(hMemery, TRUE, &pstream); *pImg = Image::FromStream(pstream); GlobalUnlock(hMemery); pstream->Release(); return TRUE; } ////////////////////////////////////////////////////////////////////////// // Bitmap版本; BOOL LoadImageFromFile(IN Bitmap** pImg, IN CString strPath) { if ( !PathFileExists(strPath) ) return FALSE; if ( *pImg ) delete *pImg; *pImg = NULL; #ifdef UNICODE *pImg = Image::FromFile(strPath); #else BSTR strtmp = _bstr_t(strPath); *pImg = Bitmap::FromFile(strtmp); SysFreeString(strtmp); #endif return TRUE; } BOOL LoadImageFromBuf(IN Bitmap** pImg, IN CString strPath) { if ( !PathFileExists(strPath) ) return FALSE; if ( *pImg ) delete *pImg; *pImg = NULL; CFile fp; CFileException e; BOOL bRet = FALSE; if ( fp.Open(strPath, CFile::modeRead, &e)) { DWORD dwLength = (DWORD)fp.GetLength(); BYTE *pData = new BYTE[dwLength]; fp.Read(pData,dwLength); fp.Close(); bRet = LoadImageFromBuf(pImg, pData, dwLength); if( pData ) delete []pData; } return bRet; } BOOL LoadImageFromBuf(IN Bitmap** pImg, IN BYTE* pBuffer, IN CONST DWORD& nBufLen) { if ( pBuffer == NULL ) return FALSE; if ( *pImg ) delete *pImg; *pImg = NULL; HGLOBAL hMemery = GlobalAlloc(GMEM_MOVEABLE, nBufLen); if ( hMemery == NULL ) return FALSE; BYTE *pMem = (BYTE*)GlobalLock(hMemery); memcpy(pMem, pBuffer, nBufLen); IStream *pstream = NULL; CreateStreamOnHGlobal(hMemery, TRUE, &pstream); *pImg = Bitmap::FromStream(pstream); GlobalUnlock(hMemery); pstream->Release(); return TRUE; } ////////////////////////////////////////////////////////////////////////// void LoadImageFromRes(Image **img, LPCTSTR lpszResourceName, LPCTSTR ResourceType) { try { HGLOBAL hGlobal = NULL; HRSRC hSource = NULL; LPVOID lpVoid = NULL; int nSize = 0; BOOL bResult = FALSE; hSource = FindResource(NULL, lpszResourceName, ResourceType); if (hSource == NULL)return; hGlobal = LoadResource(NULL, hSource); if (hGlobal == NULL)return; lpVoid = LockResource(hGlobal); if (lpVoid == NULL)return; nSize = (UINT)SizeofResource(NULL, hSource); LoadImageFromBuf(img, (BYTE*)hGlobal, nSize); UnlockResource(hGlobal); // 16Bit Windows Needs This FreeResource(hGlobal); // 16Bit Windows Needs This (32Bit - Automatic Release) } catch (...) { } } int GetOrientation(Image *image) { try { if (image) { UINT totalBufferSize; UINT numProperties; image->GetPropertySize(&totalBufferSize, &numProperties); // Allocate the buffer that will receive the property items. PropertyItem* pAllItems = (PropertyItem*)malloc(totalBufferSize); // Fill the buffer. image->GetAllPropertyItems(totalBufferSize, numProperties, pAllItems); // Print the id data member of each property item. for (UINT j = 0; j < numProperties; ++j) { if (PropertyTagOrientation == pAllItems[j].id) { short* ptrLong = (short*)(pAllItems[j].value); int ret = (int)*ptrLong; free(pAllItems); return ret; } } free(pAllItems); } } catch (...) { } return 1; } int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if (size == 0) return -1; // Failure pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if (pImageCodecInfo == NULL) return -1; // Failure GetImageEncoders(num, size, pImageCodecInfo); for (UINT j = 0; j < num; ++j) { if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; // Success } } free(pImageCodecInfo); return -1; // FailureFailure } void SaveImageToFile(Image *img, CString path) { try { if (img == NULL)return; CLSID encoderClsid; BSTR bstr = path.AllocSysString(); path.MakeLower(); if (path.Right(3) == "bmp") { GetEncoderClsid(L"image/bmp", &encoderClsid); img->Save(bstr, &encoderClsid, NULL); } else if (path.Right(3) == "png") { GetEncoderClsid(L"image/png", &encoderClsid); img->Save(bstr, &encoderClsid, NULL); } else// if(path.Right (3)=="jpg") { GetEncoderClsid(L"image/jpeg", &encoderClsid); EncoderParameters encoderParameters; ULONG quality; encoderParameters.Count = 1; encoderParameters.Parameter[0].Guid = EncoderQuality; encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong; encoderParameters.Parameter[0].NumberOfValues = 1; // Save the image as a JPEG with quality level 100. quality = 100; encoderParameters.Parameter[0].Value = &quality; img->Save(bstr, &encoderClsid, &encoderParameters); } SysFreeString(bstr); } catch (...) { } } void SaveImageToFile2(Image *img, CString path, ULONG quality) { try { if (img == NULL)return; CLSID encoderClsid; BSTR bstr = path.AllocSysString(); path.MakeLower(); if (path.Right(3) == "bmp") { GetEncoderClsid(L"image/bmp", &encoderClsid); img->Save(bstr, &encoderClsid, NULL); } else if (path.Right(3) == "png") { GetEncoderClsid(L"image/png", &encoderClsid); img->Save(bstr, &encoderClsid, NULL); } else// if(path.Right (3)=="jpg") { GetEncoderClsid(L"image/jpeg", &encoderClsid); EncoderParameters encoderParameters; encoderParameters.Count = 1; encoderParameters.Parameter[0].Guid = EncoderQuality; encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong; encoderParameters.Parameter[0].NumberOfValues = 1; // Save the image as a JPEG with quality level 100. encoderParameters.Parameter[0].Value = &quality; img->Save(bstr, &encoderClsid, &encoderParameters); } SysFreeString(bstr); } catch (...) { } } /************************************************************************/ /* 函数:IsWaiter2[8/10/2016 IT]; /* 描述:; /* 参数:; /* [IN] id:订单号; /* [IN] name:职员名; /* [IN] waiterarray:订单表信息; /* [IN] bWait1:返回是否摄影师; /* [IN] bWait2:返回是否化妆师/引导师1; /* [IN] fscale1:返回摄影师1提成; /* [IN] fscale2:返回化妆师/引导师1提成; /* [IN] bCheckDate:是否要检测时间; /* [IN] date1:开始时间; /* [IN] date2:结束时间; /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ void IsWaiter2(CString id, CString name, CArray*waiterarray, BOOL &bWait1, BOOL &bWait2, float &fscale1, float &fscale2, BOOL bCheckDate, CString date1, CString date2) { for (int i = 0; i < waiterarray->GetSize(); i++) { if (id == waiterarray->ElementAt(i).ElementAt(0)) { if (bCheckDate) { if (waiterarray->ElementAt(i).ElementAt(21) < date1 || waiterarray->ElementAt(i).ElementAt(21) > date2 || waiterarray->ElementAt(i).ElementAt(22) != "OK") //if ( waiterarray->ElementAt(i).ElementAt(21) > date2 || waiterarray->ElementAt(i).ElementAt(22) != "OK") { bWait1 = bWait2 = 0; return; } } if (name == waiterarray->ElementAt(i).ElementAt(1)) { bWait1 = 1; fscale1 = atof(waiterarray->ElementAt(i).ElementAt(5)) / 100.0; if (fscale1 == 0)fscale1 = 1; } else if (name == waiterarray->ElementAt(i).ElementAt(2)) { bWait1 = 1; fscale1 = atof(waiterarray->ElementAt(i).ElementAt(6)) / 100.0; } else if (name == waiterarray->ElementAt(i).ElementAt(3)) { bWait1 = 1; fscale1 = atof(waiterarray->ElementAt(i).ElementAt(7)) / 100.0; } else if (name == waiterarray->ElementAt(i).ElementAt(4)) { bWait1 = 1; fscale1 = atof(waiterarray->ElementAt(i).ElementAt(8)) / 100.0; } /////////////////////////////////////////////////////////////////////// if (name == waiterarray->ElementAt(i).ElementAt(9)) { bWait2 = 1; fscale2 = atof(waiterarray->ElementAt(i).ElementAt(13)) / 100.0; if (fscale2 == 0)fscale2 = 1; } else if (name == waiterarray->ElementAt(i).ElementAt(10)) { bWait2 = 1; fscale2 = atof(waiterarray->ElementAt(i).ElementAt(14)) / 100.0; } else if (name == waiterarray->ElementAt(i).ElementAt(11)) { bWait2 = 1; fscale2 = atof(waiterarray->ElementAt(i).ElementAt(15)) / 100.0; } else if (name == waiterarray->ElementAt(i).ElementAt(12)) { bWait2 = 1; fscale2 = atof(waiterarray->ElementAt(i).ElementAt(16)) / 100.0; } return; } } return; } void IsWaiter3(CString id, CString name, CArray*waiterarray, BOOL &bWait1, BOOL &bWait2, float &fscale1, float &fscale2) { bWait1 = bWait2 = 0; for (int i = 0; i < waiterarray->GetSize(); i++) { if (id == waiterarray->ElementAt(i).ElementAt(0)) { if (name == waiterarray->ElementAt(i).ElementAt(17)) { bWait1 = 1; fscale1 = atof(waiterarray->ElementAt(i).ElementAt(19)) / 100.0; if (fscale1 == 0)fscale1 = 1; } /////////////////////////////////////////////////////////////////////// if (name == waiterarray->ElementAt(i).ElementAt(18)) { bWait2 = 1; fscale2 = atof(waiterarray->ElementAt(i).ElementAt(20)) / 100.0; } return; } } return; } //------------------------------------------------------------------------------ // Remark by Jeff; // 函数:CheckPhoneType // 描述:判断手机号属于哪个运营商的; // 参数: // phoneno: 欲判断的手机号; // // 返回:返回0表示移动; 1表示联通; 2表示电信; 3表示小灵通; -1表示未知的; // // 注意: // 移动: // 139, 138, 137, 136, 135, 134, 159, 158, 152, 151, 150, 157, 188, 187, 144 // 联通: // 130, 131, 132, 155, 156, 186, 185 // 电信 : // 133, 153, 189, 180, 181, 173 //------------------------------------------------------------------------------ int CheckPhoneType(CString &phoneno) { if (phoneno.IsEmpty()) return -1; int i = 0; for ( i = 0; i < phoneno.GetLength(); i++) { if (phoneno.GetAt(i) < '0' || phoneno.GetAt(i) > '9')return -1; } if (phoneno.GetAt(0) == '1') { if (phoneno.GetLength() != 11) return -1; int mobile[] = { 139, 138, 137, 136, 135, 134, 159, 158, 152, 151, 150, 157, 188, 187, 144, 182, 147, 183, 184, 178 }; int unicom[] = { 130, 131, 132, 155, 156, 186, 185, 176 }; int telecom[] = { 133, 153, 189, 180, 181, 177, 173 }; int others[] = { 170 }; for (i = 0; i < sizeof(mobile) / sizeof(int); i++) { if (mobile[i] == atoi(phoneno.Left(3))) { return 0; } } for (i = 0; i < sizeof(unicom) / sizeof(int); i++) { if (unicom[i] == atoi(phoneno.Left(3))) { return 1; } } for (i = 0; i < sizeof(telecom) / sizeof(int); i++) { if (telecom[i] == atoi(phoneno.Left(3))) { return 2; } } for (i = 0; i < sizeof(others)/sizeof(int);i++) { if ( others[i] == atoi((phoneno.Left(3)))) { return 3; } } return -1; } return -1; } /************************************************************************/ /* 函数:CheckDateOK 描述:判断日期有效性; 参数: IN: str 要判断的日期; IN: bLunanr 是否是农历日期; 返回: 日期有效返回TRUE; 要求: 注意: 修改:Jeff 日期:2015-04-28 内容:添加日期有效性判断,同时支持农历日期; */ /************************************************************************/ BOOL CheckDateOK(IN CString &str, IN CONST BOOL &bLunanr) { if (str.IsEmpty())return 1; CString tip; int i; CString demo = CTime::GetCurrentTime().Format("%Y-%m-%d"); if (str.GetLength() != demo.GetLength()) goto ll; //2009-01-01 if (str.GetAt(4) != '-') goto ll; if (str.GetAt(7) != '-') goto ll; for (i = 0; i < str.GetLength(); i++) { if (i == 4 || i == 7)continue; if (str.GetAt(i) < '0' || str.GetAt(i) > '9') goto ll; } #if 1 if (!bLunanr) return IsValidDate(str); else return IsValidLunanrDate(str); #else return 1; #endif ll: tip.Format("日期:%s格式错误!\r\n样板:%s", str, demo); AfxMessageBox(tip, MB_ICONSTOP); return 0; } BOOL CheckBadWords(CString str, BOOL bMsg) { CString badwords[165] = { \ "【call5.me】", \ "您可拨020", \ "88btt.com热线400611", \ "400678165", \ "海王星", \ "博天堂", \ "十八大", \ "钓鱼岛", \ "无限次数提款", \ "广东地和", \ "利来", \ "抢劫", \ "fa lun", \ "强奸", \ "dafa", \ "falun", \ "SIM卡抽奖", \ "罢工", \ "罢课", \ "暴乱", \ "婊子", \ "操你", \ "操你娘", \ "蠢猪", \ "达赖", \ "打倒", \ "大法", \ "大纪元", \ "弹药", \ "钓鱼岛", \ "东突", \ "东突厥斯坦伊斯兰运动", \ "发抡", \ "发仑", \ "发伦", \ "发囵", \ "发沦", \ "发纶", \ "发轮", \ "发论", \ "法 轮 功", \ "法.轮.功", \ "法抡", \ "法仑", \ "法伦", \ "法囵", \ "法沦", \ "法纶", \ "法轮", \ "法论", \ "反革命", \ "反日", \ "分裂", \ "干你娘", \ "功友", \ "古怪歌", \ "国研新闻邮件", \ "黑庄", \ "宏志", \ "洪志", \ "胡锦涛", \ "鸡巴", \ "鸡毛信文汇", \ "妓女", \ "简鸿章", \ "江八点", \ "江独裁", \ "江泽民", \ "疆独", \ "教徒", \ "锦涛", \ "靖国神社", \ "九、评", \ "九.评", \ "九码", \ "九-评", \ "拉丹", \ "拉登", \ "李鹏", \ "联总之声传单", \ "灵动卡", \ "六合彩", \ "六码", \ "吕秀莲", \ "绿色环保手机", \ "美国之音", \ "猛料", \ "迷药", \ "民运", \ "民猪", \ "嫖娼", \ "迫害", \ "枪支", \ "强奸", \ "窃听器", \ "人民报", \ "人民报讯", \ "人民大众时事参考", \ "人民内情真相", \ "人民真实报道", \ "人权", \ "日你妈", \ "日他", \ "三码", \ "三陪", \ "色情", \ "傻B", \ "涉日", \ "十六大", \ "示威", \ "他妈的", \ "台*湾", \ "特等奖", \ "天葬", \ "突厥斯坦", \ "推翻", \ "王八蛋", \ "温家宝", \ "无能", \ "香港总部", \ "小鸡鸡", \ "新华举报", \ "新华内情", \ "新闻封锁", \ "畜生", \ "玄`机", \ "压迫", \ "淫秽", \ "银行联合管理局", \ "印尼伊斯兰祈祷团", \ "游行", \ "舆论", \ "造反", \ "真善忍", \ "镇压", \ "正法", \ "政变", \ "政治风波", \ "中俄边界新约", \ "中国银联", \ "中华民国", \ "中奖", \ "朱容基", \ "自焚", \ "自由运动", \ "达赖", \ "套牌", \ "情妇", \ "监听", \ "巴南电信", \ "合川分公司", \ "合川电信", \ "死光", \ "116114", \ "北京宝诚", \ "华盛投资", \ "名门国际", \ "利博", \ "赤橙黄绿", \ "免佣BJL首发", \ "洗*码优惠", \ "【俱乐部】", \ "18266381922", \ "回拨卡", \ "号码百事通推出短信订机票!实时" }; for (int i = 0; i < 165; i++) { g_temp = badwords[i]; if (str.Find(g_temp) != -1) { // AfxMessageBox("信息服务商禁止的非法字符:("+g_temp+")希望您谅解!"); return 0; } } return 1; } ///目录是否存在的检查: 支持网络文件夹 bool CheckFolderFileExist(CString &strPath) { CString path = strPath; CFile fp; if (fp.Open(path, CFile::modeRead)) { fp.Close(); return 1; } if (strPath.Right(1) != "\\") path += "\\"; path += "zaqw1234.dat"; DeleteFile(path); // 删除zaqw1234.dat文件; if (fp.Open(path, CFile::modeCreate) == 0) return 0; fp.Close(); if (PathFileExists(path)) // Jeff 删除文件前判断文件是否存在; ::DeleteFile(path); // 删除zaqw1234.dat文件; return 1; } int FindArray(CStringArray *pArray, const CString &Str) { for (int i = 0; i < pArray->GetSize(); i++) { if (pArray->ElementAt(i) == Str) return i; } return -1; } void FillLength(CString &str, int length) { while (str.GetLength() < length) str += " "; } // 查找不到年历史数据库则返回-1; int GetYearPos(int year) { for (int i = 0; i < g_hisyeararray.GetSize(); i++) { if (year == atoi(g_hisyeararray.ElementAt(i).ElementAt(0))) return i; } return -1; } /************************************************************************/ /* 函数:GIsHalfHZ 描述:判断输入的字符串最后一个字符是否是汉字; 参数: 返回:如果是一个完整的汉字,返回TRUE。否则返回FALSE; */ /************************************************************************/ BOOL GIsHalfHZ(const CString &str) { #if 0 // 有问题的判断,当含有一个英文字母时; int len = str.GetLength(); BOOL IsHalf = FALSE; for (int i = 0; i < len; i++) { if (str.GetAt(i) < 0) IsHalf = !IsHalf; } return IsHalf; #else #if 1 INT nLength = str.GetLength(); BOOL IsHalf = FALSE; for ( INT i = 0; i < nLength; ) { if ( str.GetAt(i) < 0 ) { i += 2; if ( i > nLength ) IsHalf = TRUE; } else { i++; } } return IsHalf; #else INT nLength = str.GetLength(); INT wSize = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); WCHAR *szStr = new WCHAR[wSize]; INT nnnnn = 0; INT nCount = 0; INT convresult = MultiByteToWideChar(CP_ACP, 0, str, -1, szStr, wSize); for ( INT i = 0; i < wSize; i++ ) { if ( (szStr[i] >= 0x2E80 && szStr[i] <= 0xFE4F) || ( szStr[i] >= 0xFF00 && szStr[i] <= 0xFFEF) ) nCount++; else nnnnn++; } return !(nCount%2); #endif #endif } void WriteTitle(CString str) { g_title = str; CStdioFile fp; fp.Open(g_mainpath + "\\title.txt", CFile::modeWrite | CFile::modeCreate); fp.WriteString(str); fp.Close(); } CString GetIP(CString branch) { for (int i = 0; i < g_brancharray.GetSize(); i++) { if (g_domain == g_brancharray.ElementAt(i).ElementAt(2)) { //if(g_serverbak.Find (".ly.com")!=-1) return g_server; CString ip = g_serverbak; MyGetIPByName(ip); return ip; } if (branch == g_brancharray.ElementAt(i).ElementAt(0)) { return g_brancharray.ElementAt(i).ElementAt(1); } } return ""; } CString GetBranchIPbyId( IN LPCTSTR lpStrBranchId ) { if ( g_domain.CompareNoCase(lpStrBranchId) == 0 ) { return g_server; } CString strBranchIP = _T(""); INT nCount = g_brancharray.GetSize(); for ( int i = 0; i < nCount; i++ ) { if ( g_brancharray.ElementAt(i).ElementAt(2).CompareNoCase(lpStrBranchId) == 0 ) { strBranchIP = g_brancharray.ElementAt(i).ElementAt(1); break; } } return strBranchIP; } CString GetBranchNamebyId( IN LPCTSTR lpStrBranchId ) { if ( g_domain.CompareNoCase(lpStrBranchId) == 0 ) { return _T(""); } CString strBranchName = _T(""); INT nCount = g_brancharray.GetSize(); for ( int i = 0; i < nCount; i++ ) { if ( g_brancharray.ElementAt(i).ElementAt(2).CompareNoCase(lpStrBranchId) == 0 ) { strBranchName = g_brancharray.ElementAt(i).ElementAt(0); break; } } return strBranchName; } BOOL IsHanZi(CString str) { TBYTE ucHigh, ucLow; for (int i = 0; i < str.GetLength(); i++) { if ((TBYTE)str[i] < 0x80) { continue; } ucHigh = (TBYTE)str[i]; ucLow = (TBYTE)str[i + 1]; if (ucHigh < 0xa1 || ucLow < 0xa1) { continue; } return 1; } return 0; } int GetType(CString str) { if (IsHanZi(str))return 0; BOOL bDigit = 1; BOOL bAlpha = 1; for (int i = 0; i < str.GetLength(); i++) { if (!::isdigit(str.GetAt(i))) bDigit = 0; if (!((str.GetAt(i) <= 'z' && str.GetAt(i) >= 'a') || (str.GetAt(i) <= 'Z' && str.GetAt(i) >= 'A'))) //else if(!::isalpha ( ((unsigned char)str.GetAt (i)))) bAlpha = 0; if (bDigit == 0 && bAlpha == 0)return 0; } if (bDigit) { return 0; } else if (bAlpha) { return 2; } else return 0; } CString FilterBZ(CString &bz) { bz.Replace("'", ""); if (bz.GetLength() > 1023) { AfxMessageBox("文字太长, 字符串将被截取!", MB_ICONSTOP); bz = bz.Left(1023); } return bz; } // GetWidth()的长度与CRect的长度是不一样的单位值,需要转换适合的比例;(一个是图片的像素尺寸,一个DC的大小尺寸) // 将图片尺寸与设备尺寸进行转换适合的比例; void RectFitDes(int width, int height, CRect &rc) { try { if (width == 0 || height == 0)return; // 图片长宽比例; float fscale = (float)width / (float)height; // 设备长宽比例; float rcscale = ((float)rc.Width()) / ((float)rc.Height()); int rcwid = rc.Width(); int rchei = rc.Height(); int dt = 0; // Jeff.如果设备长宽比例 < 图片长宽比例;(即相同长度下,高越大比例值越小,所以此时图片尺寸 与 显示设备的尺寸相比,要显得更长) if (rcscale < fscale) { // Jeff.remarks // 调整显示设备的大小,以使之能容纳图片尺寸;(即长宽比例上,要大于或等于图片的长宽比例) // 所以有两种方法使得 rcscale >= fscale 表达式成立: // ----------------------------------------------- // 方法1:显示设备宽加x值,计算出下面表达式x的值即可 // (rc.Width()+x) / rc.Height() >= width/height; // 方法2:显示设备高减x值,计算出下面表达式x的值即可 // (rc.Width()) / (rc.Height()-x) >= width/height; //------------------------------------------------ // 两种方法的最后表达式为: // x >= rc.Height() - rcWidth()*(height/width); // 即 x >= rc.Height() - rcWidth()/fscale; //------------------------------------------------ dt = (rchei - rcwid / fscale) / 2; rc.top += dt; rc.bottom -= dt; } else { dt = (rcwid - rchei*fscale) / 2; rc.left += dt; rc.right -= dt; } } catch (...) { } } BOOL IsHasRights(int pos) // Jeff,无意义的函数; { return 1; if (g_user.rights.GetLength() > pos) { BOOL ret = atoi(g_user.rights.Mid(pos, 1)); if (ret == 0)AfxMessageBox("没有相关权限!", MB_ICONINFORMATION); return ret; } AfxMessageBox("没有相关权限!", MB_ICONINFORMATION); return 0; } BOOL IsHasRights2(int pos)// Jeff,无意义的函数; { return 1; if (g_user.rights.GetLength() > pos) { BOOL ret = atoi(g_user.rights.Mid(pos, 1)); return ret; } return 0; } BOOL IsHasRightsnew(int pos) { if (g_user.rights.GetLength() > pos) { BOOL ret = atoi(g_user.rights.Mid(pos, 1)); if (ret == 0) AfxMessageBox("没有相关权限! 请与系统管理员联系!", MB_ICONINFORMATION); return ret; } AfxMessageBox("没有相关权限! 请与系统管理员联系!", MB_ICONINFORMATION); return 0; } BOOL IsHasRights2new(int pos) { if (g_user.rights.GetLength() > pos) { BOOL ret = atoi(g_user.rights.Mid(pos, 1)); return ret; } return 0; } BOOL IsHasRightsnew2(int pos, CString rights) { if (rights.GetLength() > pos) { BOOL ret = atoi(rights.Mid(pos, 1)); if (ret == 0)AfxMessageBox("没有相关权限! 请与系统管理员联系!", MB_ICONINFORMATION); return ret; } AfxMessageBox("没有相关权限! 请与系统管理员联系!", MB_ICONINFORMATION); return 0; } /******************************************************************************************** /* Syntax /* void FirstLetter(int nCode, CString& strLetter) /* Remarks: /* Get the first letter of pinyin according to specified Chinese character code. /* Parameters: /* nCode - the code of the chinese character. /* strLetter - a CString object that is to receive the string of the first letter. /* Return Values: /* None. /* Author: /* lixiaosan /* Create Date: /* 05-26-2006 /********************************************************************************************/ void FirstLetter(int nCode, CString& strLetter) { if (nCode >= 1601 && nCode < 1637) strLetter = _T("A"); if (nCode >= 1637 && nCode < 1833) strLetter = _T("B"); if (nCode >= 1833 && nCode < 2078) strLetter = _T("C"); if (nCode >= 2078 && nCode < 2274) strLetter = _T("D"); if (nCode >= 2274 && nCode < 2302) strLetter = _T("E"); if (nCode >= 2302 && nCode < 2433) strLetter = _T("F"); if (nCode >= 2433 && nCode < 2594) strLetter = _T("G"); if (nCode >= 2594 && nCode < 2787) strLetter = _T("H"); if (nCode >= 2787 && nCode < 3106) strLetter = _T("J"); if (nCode >= 3106 && nCode < 3212) strLetter = _T("K"); if (nCode >= 3212 && nCode < 3472) strLetter = _T("L"); if (nCode >= 3472 && nCode < 3635) strLetter = _T("M"); if (nCode >= 3635 && nCode < 3722) strLetter = _T("N"); if (nCode >= 3722 && nCode < 3730) strLetter = _T("O"); if (nCode >= 3730 && nCode < 3858) strLetter = _T("P"); if (nCode >= 3858 && nCode < 4027) strLetter = _T("Q"); if (nCode >= 4027 && nCode < 4086) strLetter = _T("R"); if (nCode >= 4086 && nCode < 4390) strLetter = _T("S"); if (nCode >= 4390 && nCode < 4558) strLetter = _T("T"); if (nCode >= 4558 && nCode < 4684) strLetter = _T("W"); if (nCode >= 4684 && nCode < 4925) strLetter = _T("X"); if (nCode >= 4925 && nCode < 5249) strLetter = _T("Y"); if (nCode >= 5249 && nCode < 5590) strLetter = _T("Z"); } /******************************************************************************************** /* Syntax /* GetFirstLetter(CString strName, CString& strFirstLetter) /* Remarks: /* Get the first letter of pinyin according to specified Chinese character. /* Parameters: /* strName - a CString object that is to be parsed. /* strFirstLetter - a CString object that is to receive the string of the first letter. /* Return Values: /* None. /* Author: /* lixiaosan /* Create Date: /* 05-26-2006 /********************************************************************************************/ void GetFirstLetter(CString strName, CString& strFirstLetter) { TBYTE ucHigh, ucLow; int nCode; CString strRet; strFirstLetter.Empty(); for (int i = 0; i < strName.GetLength(); i++) { if ((TBYTE)strName[i] < 0x80) { strRet = strName.Mid(i, 1); strRet.MakeUpper(); strFirstLetter += strRet; continue; } ucHigh = (TBYTE)strName[i]; ucLow = (TBYTE)strName[i + 1]; if (ucHigh < 0xa1 || ucLow < 0xa1) continue; else nCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0; FirstLetter(nCode, strRet); strFirstLetter += strRet; i++; } } CString newGUID() { CString str; GUID guid; CoInitialize(NULL); if (S_OK == ::CoCreateGuid(&guid)) { str.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 str.Left(28); } CString GetNameFromDomain(CString domain) { for (int i = 0; i < g_brancharray.GetSize(); i++) { if (domain == g_brancharray.ElementAt(i).ElementAt(2)) { return g_brancharray.ElementAt(i).ElementAt(0); } } return ""; } void ConvertToPrice(CString &str) { if (str.Find('.') == -1)return; str.TrimRight('0'); str.TrimRight('.'); } int GetLengthEx(CString str) { wchar_t wstr[500]; int k = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, strlen(str), wstr, 500); return k; } inline int MultiByteLengthConvertToWideCharLength(/*LPCSTR*/LPCCH lpString) { return MultiByteToWideChar(CP_ACP, 0, lpString, -1, NULL, 0); } //判断字符是否是数字(0 – 9) BOOL myisdigit(CString str) { for (int i = 0; i < str.GetLength(); i++) { if (!::isdigit(str.GetAt(i))) return 0; } return 1; } DWORD FindAppProcessID(CString path) { try { HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); PROCESSENTRY32 Info; Info.dwSize = sizeof(PROCESSENTRY32); path.MakeLower(); if (::Process32First(handle, &Info)) { do { CString ss = Info.szExeFile; ss.MakeLower(); if (ss.Find(path) != -1 || (!ss.CompareNoCase(path))) { ::CloseHandle(handle); return Info.th32ProcessID; } } while (::Process32Next(handle, &Info)); ::CloseHandle(handle); } return -1; } catch (...) { } } BOOL isInnerIP(DWORD a_ip) // Jeff.判断是否是内网? { BOOL bValid = 0; if ((a_ip >> 24 == 0xa) || (a_ip >> 16 == 0xc0a8) || (a_ip >> 22 == 0x2b0)) { bValid = 1; } return bValid; } void MyGetIPByName2(CString &name) { CString strIP = name; name.Empty(); DWORD dwServerIP = 0; HOSTENT *host = gethostbyname(strIP); struct in_addr addr; if (host != NULL) { for (int i = 0; host->h_addr_list[i] != NULL; i++) { memset(&addr, 0, sizeof(addr)); memcpy(&addr.S_un.S_addr, host->h_addr_list[i], host->h_length); dwServerIP = ntohl(addr.S_un.S_addr); BYTE* pIP = (BYTE*)&dwServerIP; name.Format(_T("%d.%d.%d.%d"), pIP[3], pIP[2], pIP[1], pIP[0]); } } } void MyGetIPByName(CString &name) // Jeff.根据计算机名称获取IP地址; { g_serverarray.RemoveAll(); CString strIP = name; name.Empty(); DWORD dwServerIP = 0; HOSTENT *host = gethostbyname(strIP); // Jeff.所有本机的网络适配器; struct in_addr addr; if (host != NULL) { // Jeff.遍历本机所有适配器的IP地址; for (int i = 0; host->h_addr_list[i] != NULL; i++) { memset(&addr, 0, sizeof(addr)); memcpy(&addr.S_un.S_addr, host->h_addr_list[i], host->h_length); dwServerIP = ntohl(addr.S_un.S_addr); BYTE* pIP = (BYTE*)&dwServerIP; name.Format(_T("%d.%d.%d.%d"), pIP[3], pIP[2], pIP[1], pIP[0]); g_serverarray.Add(name); } } while (g_serverarray.GetSize() > 1) { CString name; BOOL bFind = 0; for (int i = 0; i < g_serverarray.GetSize(); i++) { DWORD dwServerIP = inet_addr(g_serverarray.ElementAt(i)); dwServerIP = htonl(dwServerIP);//加了才正确 if (isInnerIP(dwServerIP) == 0) { g_serverarray.RemoveAt(i); bFind = 1; break; } } if (bFind == 0) { break; } } } int IsExistFolder(char *szPath)//可判断文件夹和文件的存在; { if ((_access(szPath, 0)) != -1) { if ((_access(szPath, 2)) != -1) { return 1; } } else { return -1; } } CString GetW(CString str) { int x = atoi(str); if (x > 9999) { str.Format("%d", x); str = str.Right(5); str = str.Left(1); return str; } return ""; } CString GetK(CString str) { int x = atoi(str); if (x > 999) { str.Format("%d", x); str = str.Right(4); str = str.Left(1); return str; } return ""; } CString GetB(CString str) { int x = atoi(str); if (x > 99) { str.Format("%d", x); str = str.Right(3); str = str.Left(1); return str; } return ""; } CString GetS(CString str) { int x = atoi(str); if (x > 9) { str.Format("%d", x); str = str.Right(2); str = str.Left(1); return str; } return ""; } CString GetG(CString str) { int x = atoi(str); if (x > 0) { str.Format("%d", x); str = str.Right(1); return str; } return ""; } CString GetHMoney(CString str) { if (str.IsEmpty())return ""; if (str == "0")return "零"; if (atoi(str) < 1 || atoi(str) > 9)return ""; CString ret[] = { "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; return ret[atoi(str) - 1]; } BOOL CheckDateOK2(CString str) { if (str.IsEmpty())return 0; CString tip; int i; CString demo = CTime::GetCurrentTime().Format("%Y-%m-%d"); if (str.GetLength() != demo.GetLength()) goto ll; //2009-01-01 if (str.GetAt(4) != '-') goto ll; if (str.GetAt(7) != '-') goto ll; for (i = 0; i < str.GetLength(); i++) { if (i == 4 || i == 7)continue; if (str.GetAt(i) < '0' || str.GetAt(i) > '9') goto ll; } return 1; ll: return 0; } CString GetDomainFromBranch(CString branch) { if (branch.IsEmpty())return ""; for (int i = 0; i < g_brancharray.GetSize(); i++) { if (branch == g_brancharray.ElementAt(i).ElementAt(0)) { return g_brancharray.ElementAt(i).ElementAt(2); } } return ""; } CString GetBranchPhotoPath(CString branch) { if (branch.IsEmpty())return ""; for (int i = 0; i < g_brancharray.GetSize() - 1; i++) { if (branch == g_brancharray.ElementAt(i).ElementAt(0)) { return "\\" + g_brancharray.ElementAt(i).ElementAt(2); } } return ""; } CTime GetTmFromStr(CString date) { try { CTime tm(atoi(date.Mid(0, 4)), atoi(date.Mid(5, 2)), atoi(date.Mid(8, 2)), 0, 0, 0); CString ss; ss.Format("%d-%d-%d", tm.GetYear(), tm.GetMonth(), tm.GetDay()); return tm; } catch (...) { date = "1980-01-01"; CTime tm(atoi(date.Mid(0, 4)), atoi(date.Mid(5, 2)), atoi(date.Mid(8, 2)), 0, 0, 0); return tm; } } //--------------------------------------------------------------------- // add by Jeff 2014.10.24 // 函数:全局函数lyfzCopyFileEx // 描述:文件复制。 // 参数: // lpExistingFileName:你要拷贝的源文件名; // lpNewFileName: 你要拷贝的目标文件名; // bFailIfExists: 如果目标已经存在,不拷贝(True)并重命名,覆盖目标(false) // 返回:与CopyFile返回一致; //--------------------------------------------------------------------- BOOL lyfzCopyFileEx(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, const BOOL &bFailIfExists) { // 1.如果是覆盖选项; if (!bFailIfExists) return CopyFile(lpExistingFileName, lpNewFileName, bFailIfExists); // 2.如果不是覆盖选项; TCHAR szNewFileName[_MAX_PATH] = { 0 }; TCHAR szDrive[_MAX_DRIVE] = { 0 }; TCHAR szDir[_MAX_DIR] = { 0 }; TCHAR szFna[_MAX_FNAME] = { 0 }; TCHAR szExt[_MAX_EXT] = { 0 }; sprintf(szNewFileName, "%s", lpNewFileName); _tsplitpath(szNewFileName, szDrive, szDir, szFna, szExt); int nIndex = 1; while (PathFileExists(szNewFileName)) { sprintf(szNewFileName, "%s%s%s (%d)%s", szDrive, szDir, szFna, nIndex++, szExt); } return CopyFile(lpExistingFileName, szNewFileName, bFailIfExists); } //--------------------------------------------------------------------- // add by Jeff 2014.10.24 // 函数:全局函数lyfzImportImage,多字节版本,非UNICODE // 描述:导入图片。 // 参数: // lpDestDirectory: 文件导入的目标目录; // strArrayOfImage: 要导入的图片文件数组; // bFailIfExists: 如果目标已经存在,不拷贝(True)并重命名,覆盖目标(false) // 返回: // // 说明:在调用lyfzImportImage前,需要对传递的参数进行有效性验证 // 1.验证形参lpDestDirectory对应的实参是否是有效的目录(有无创建目录的非法字符存在) // 2.验证形参strArrayOfImage对应的实参数组是否大于0; // 如果校验没有通过,应该拒绝调lyfzImportImage,以防止错误产生。 //--------------------------------------------------------------------- void lyfzImportImage(LPCTSTR lpDestDirectory, CStringArray &strArrayOfImage, const BOOL &bFailIfExists) { // 传递给lyfzCreateDirectory的参数规范化; int nlen = strlen(lpDestDirectory); TCHAR szNewFileName[_MAX_PATH] = { 0 }; TCHAR szTempDirectory[_MAX_PATH] = { 0 }; if (lpDestDirectory[nlen - 1] != '\\') sprintf(szTempDirectory, "%s\\", lpDestDirectory); else sprintf(szTempDirectory, "%s", lpDestDirectory); // 若目录或子目录不存在创建; lyfzCreateDirectory(szTempDirectory); // 遍历复制; CString strImage; INT_PTR nSize = strArrayOfImage.GetSize(); for (INT_PTR i = 0; i < nSize; i++) { strImage = strArrayOfImage.ElementAt(i); strImage = strImage.Mid(strImage.ReverseFind('\\') + 1); //strImage = strImage.Left(strImage.ReverseFind('.')); sprintf(szNewFileName, "%s%s", szTempDirectory, strImage); lyfzCopyFileEx(szNewFileName, strArrayOfImage.ElementAt(i), bFailIfExists); } } //--------------------------------------------------------------------- // add by Jeff 2014.10.25 // 函数:全局函数lyfzCreateDirectory,多字节版本,非UNICODE // 描述:创建目录及子目录文件夹; // 参数: // lpDestDirectory:目录,必须是"E:\lyfzdb\数据\"格式,目录最后必须有"\",否则最后一个子目录无法创建! // 建议使用系统_tsplitpath来分隔目录,这样会保存最后一个"\"斜杠; // 返回:成功创建返回TRUE; //--------------------------------------------------------------------- BOOL lyfzCreateDirectory(LPCTSTR lpDestDirectory) { BOOL bExists = FALSE; TCHAR szNewFileName[_MAX_PATH] = { 0 }; TCHAR szDrive[_MAX_DRIVE] = { 0 }; TCHAR szDir[_MAX_DIR] = { 0 }; TCHAR szFna[_MAX_FNAME] = { 0 }; TCHAR szExt[_MAX_EXT] = { 0 }; int nIndex = 0; do { bExists = PathFileExists(lpDestDirectory); if (!bExists) { memset(szDrive, 0, _MAX_DRIVE); memset(szDir, 0, _MAX_DIR); memset(szFna, 0, _MAX_FNAME); memset(szExt, 0, _MAX_EXT); lyfzSplitpath(lpDestDirectory, szDrive, szDir, ++nIndex); sprintf(szNewFileName, _T("%s%s"), szDrive, szDir); CreateDirectory(szNewFileName, NULL); //if (FALSE == CreateDirectory(szNewFileName, NULL)) //{ //ShowSystemErrorInfo(CString("创建目录出错。"), GetLastError()); //return FALSE; // continue; //} } } while (!bExists); return TRUE; } //--------------------------------------------------------------------- // add by Jeff 2014.10.24 // 函数:全局函数tSplitpath,多字节版本,非UNICODE // 描述:类系统Windows C++运行库函数_tsplitpath。 // 参数: // // 返回: //--------------------------------------------------------------------- void lyfzSplitpath(const char *path, char *drive, char *dir, const int &nTimes) { int nlen = strlen(path); int i = 0; int npoint = 0; // '.' int nsprit = 0; // '\\' int ncolon = 0; // ':' int ntimes = -1; while (nlen > i++) { if (path[i] == ':') ncolon = i; else if (path[i] == '\\') { if (nTimes == ntimes++) break; nsprit = i; } } memcpy(drive, path, ncolon + 1); memcpy(dir, &path[ncolon + 1], nsprit - ncolon); } //--------------------------------------------------------------------- // Jeff add 2014.06.23; // 函数:ShowErrorInfo // 描述: // 参数: // lpszFunction:函数名; // dwError:错误码; // 返回: //--------------------------------------------------------------------- void ShowSystemErrorInfo(CString &strDescription, const DWORD &dwError) { #if 0 LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); // Display the error message and exit the process CString strDisplay; strDisplay.Format("失败错误码=%d,Windows内部描述:%s", dwError, lpMsgBuf); strDescription += strDisplay; AfxMessageBox(strDescription); LocalFree(lpMsgBuf); #endif LPVOID lpMsgBuf; BOOL fOk = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); if (!fOk) { // Is it a network-related error? HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES); if (hDll != NULL) { FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, hDll, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPTSTR)&lpMsgBuf, 0, NULL); FreeLibrary(hDll); } } if (lpMsgBuf != NULL) { CString strDisplay; strDisplay.Format("%s.错误码=%d,Windows描述:%s", strDescription, dwError, (LPCTSTR)LocalLock(lpMsgBuf)); //WriteLogin(strDisplay); AfxMessageBox(strDisplay); LocalFree(lpMsgBuf); } else { //WriteLogin(strDescription); AfxMessageBox("未知道错误"); } } /************************************************************************/ /* 函数:WriteTextLog[7/28/2016 IT]; /* 描述:写文本日志; /* 参数:; /* [IN] :; /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ void WriteTextLog(const TCHAR *format, ...) { try { // 解析出日志路径; TCHAR szlogpath[MAX_PATH] = {0}; static TCHAR szModulePath[MAX_PATH] = {0}; static TCHAR szFna[_MAX_DIR] = { 0 }; if ( szModulePath[0] == _T('\0') ) { TCHAR szDrive[_MAX_DRIVE] = { 0 }; TCHAR szDir[_MAX_DIR] = { 0 }; TCHAR szExt[_MAX_DIR] = { 0 }; ::GetModuleFileName(NULL, szModulePath, sizeof(szModulePath) / sizeof(TCHAR)); _splitpath(szModulePath, szDrive, szDir, szFna, szExt); strcpy(szModulePath, szDrive); strcat(szModulePath, szDir); } sprintf(szlogpath, _T("%s客户端日志.txt"), szModulePath); // 打开或创建文件; CStdioFile fp; if (PathFileExists(szlogpath)) { if ( !fp.Open(szlogpath, CFile::modeWrite) ) { return; } fp.SeekToEnd(); } else { if ( !fp.Open(szlogpath, CFile::modeCreate | CFile::modeWrite) ) return; } // 格式化前设置语言区域; TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL)); _tsetlocale(LC_CTYPE, _T("chs"));//设定中文; // 格式化日志内容; va_list args = NULL; int len = 0; static TCHAR buffer[8192] = {0}; va_start( args, format ); /*len = printf( format, args ) + 1;// VC6.0下printf由于安全性问题会出错; if ( len == 0 ) { TCHAR *pErr = strerror(errno); OutputDebugString(pErr); } buffer = (TCHAR*)malloc( len * sizeof(TCHAR) ); if ( buffer == NULL ) { _tsetlocale(LC_CTYPE, old_locale); free(old_locale);//还原区域设定; fp.Close(); return; }*/ memset(buffer, 0, 8192); vsprintf( buffer, format, args ); // C4996 // Note: vsprintf is deprecated; consider using vsprintf_s instead // 将日志内容输入到文件中; fp.WriteString( CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S ")) ); fp.WriteString(buffer); fp.WriteString(_T("\n")); // 关闭文件,释放资源并设置回原语言区域; //free( buffer ); _tsetlocale(LC_CTYPE, old_locale); free(old_locale);//还原区域设定; fp.Close(); } catch (CException *e) { e->ReportError(); e->Delete(); } } //--------------------------------------------------------------------- // add by Jeff 2014.10.27 // 函数:全局函数IsDirectoryLegitimate,多字节版本,非UNICODE // 描述:判断一个目录路径字符串,是否属于合法的、可创建的目录路径。 // 参数:strDirectory 被验证的路径字符串; // // 返回:合法路径返回TRUE; //--------------------------------------------------------------------- BOOL IsDirectoryLegitimate(const CString &strDirectory) { if (strDirectory.Find('/') != -1 || strDirectory.Find('\\') != -1 || strDirectory.Find(':') != -1 || strDirectory.Find('*') != -1 || strDirectory.Find('?') != -1 || strDirectory.Find('\"') != -1 || strDirectory.Find('>') != -1 || strDirectory.Find('<') != -1 || strDirectory.Find('|') != -1 ) return FALSE; return TRUE; } //---------------------------------------------------------------------- // remark by Jeff 2014.11.08 // 函数:ExportCutImageToFile // 描述:导出裁剪图片到指定目录; // 参数: // lpOrderCutImageInfo:订单号的裁剪相片信息; // lpSrcDirectory:原图片路径; // lpOrderCutImageInfo格式:相片名|裁剪方案|原片宽|原片高|裁剪left|裁剪top|裁剪bottom|裁剪rigth // 225:5X7,1440,900,88,0,1352,900;228:5X7,1440,900,88,0,1352,900;224:5X7,1440,900,88,0,1352,900;227:10寸,1440,900,56,0,1384,900;229:10寸水晶,1440,900,570,232,870,671; // lpSaveDirectory:导出相片的保存路径; // 返回:无 //---------------------------------------------------------------------- void ExportCutImageToFile(LPCCH lpOrderCutImageInfo, LPCCH lpSrcDirectory, LPCCH lpSaveDirectory) { if (FALSE == lyfzCreateDirectory(lpSaveDirectory)) return; CStringArray saSrcPhoto; GetCountOfOrderFolderPhotoFile(lpSrcDirectory, saSrcPhoto); CString strImageName; // 相片名; CString strCutScheme; // 裁剪方案; CRect rtCut; // 要裁剪的区域; CString strTemp; CString strImageInfo(lpOrderCutImageInfo); int nIndex = -1; do { // 225:5X7,1440,900,88,0,1352,900; nIndex = strImageInfo.Find(';'); strTemp = strImageInfo.Left(nIndex); strImageInfo = strImageInfo.Mid(nIndex + 1); int SrcImageWid; int SrcImageHei; int ntempIndex = -1; if (nIndex != -1) { if (FALSE == AnalysisImagInfo(saSrcPhoto,lpSrcDirectory, lpSaveDirectory, strTemp, strImageName, strCutScheme, rtCut)) continue; } else { if (strImageInfo.IsEmpty()) break; AnalysisImagInfo(saSrcPhoto,lpSrcDirectory, lpSaveDirectory, strImageInfo, strImageName, strCutScheme, rtCut); break; } } while (nIndex != -1); } //---------------------------------------------------------------------- // remark by Jeff 2014.11.08 // 函数:AnalysisImagInfo // 描述:导出裁剪图片到指定目录; // 参数: // lpOrderCutImageInfo:订单号的裁剪相片信息; // lpSrcDirectory:原图片路径; // lpOrderCutImageInfo格式:相片名|裁剪方案|原片宽|原片高|裁剪left|裁剪top|裁剪bottom|裁剪rigth // 225:5X7,1440,900,88,0,1352,900; // lpSaveDirectory:导出相片的保存路径; // 返回:无 // // 说明:未对图片进行缩小,直接在原片上裁剪而得。 //---------------------------------------------------------------------- BOOL AnalysisImagInfo(CStringArray &saSrcPhoto, LPCCH lpSrcDirectory, LPCCH lpSaveDirectory, CString &strImageInfo, CString &strImageName, CString &strCutScheme, CRect &rtCut) { int ntempIndex = -1; strImageName = strImageInfo.Left(3); // 裁剪相片名; strImageInfo.Delete(0, 4); CString strSrcImagePath; BOOL bExist = FALSE; for (int i = 0; i < saSrcPhoto.GetSize(); i++) { CString strTemp = saSrcPhoto.ElementAt(i); strSrcImagePath = strTemp; _splitpath((LPCTSTR)saSrcPhoto.ElementAt(i), NULL, NULL, strTemp.GetBuffer(0), NULL); strTemp.ReleaseBuffer(); if ( strTemp == strImageName) { bExist = TRUE; //saSrcPhoto.RemoveAt(i); break; } } if (FALSE == bExist) return FALSE; ntempIndex = strImageInfo.Find(','); strCutScheme = strImageInfo.Left(ntempIndex); // 裁剪方案; strImageInfo.Delete(0, ntempIndex + 1); // 裁剪原图宽; ntempIndex = strImageInfo.Find(','); LONG SrcImageWid = _ttol(strImageInfo.Left(ntempIndex)); strImageInfo.Delete(0, ntempIndex + 1); // 裁剪原图高; ntempIndex = strImageInfo.Find(','); LONG SrcImageHei = _ttol(strImageInfo.Left(ntempIndex)); strImageInfo.Delete(0, ntempIndex + 1); // left坐标值; ntempIndex = strImageInfo.Find(','); rtCut.left = _ttol(strImageInfo.Left(ntempIndex)); strImageInfo.Delete(0, ntempIndex + 1); // top坐标; ntempIndex = strImageInfo.Find(','); rtCut.top = _ttol(strImageInfo.Left(ntempIndex)); strImageInfo.Delete(0, ntempIndex + 1); // right坐标; ntempIndex = strImageInfo.Find(','); rtCut.right = _ttol(strImageInfo.Left(ntempIndex)); strImageInfo.Delete(0, ntempIndex + 1); // bottom坐标; rtCut.bottom = _ttol(strImageInfo.Left(ntempIndex)); // 导出裁剪相片到指定目录; // 1.加载原图; Image *SrcImage = NULL; //if (FALSE == PathFileExists(CString(lpSrcDirectory + strImageName + _T(".jpg")))) if (FALSE == PathFileExists(strSrcImagePath)) { AfxMessageBox(_T("相片源文件不存在")); return FALSE; } //LoadImageFromBuf(&SrcImage, CString(lpSrcDirectory + strImageName + _T(".jpg"))); LoadImageFromBuf(&SrcImage, strSrcImagePath); if (SrcImage == NULL) { AfxMessageBox(_T("加载源图片失败")); return FALSE; } int orientation = GetOrientation(SrcImage); if (orientation == 8) SrcImage->RotateFlip(Rotate270FlipNone); else if (orientation == 6) SrcImage->RotateFlip(Rotate90FlipNone); if (SrcImage->GetWidth() == 0) return FALSE; float scale = 1.0; scale *= (float)SrcImage->GetWidth() / (float)SrcImageWid; rtCut.left *= scale; rtCut.right *= scale; rtCut.top *= scale; rtCut.bottom *= scale; #if 0 // 保存在原图上画裁剪区域; Graphics graph(SrcImage); Pen blackPen(Color(255, 255, 0, 0), 1); graph.DrawRectangle(&blackPen, rtCut.left, rtCut.top, rtCut.Width(), rtCut.Height()); SaveImageToFile(SrcImage, CString(lpSaveDirectory + strImageName + _T(".jpg"))); delete SrcImage; #else // 直接保存裁剪后的图片; Bitmap bp(rtCut.Width(), rtCut.Height()); Graphics *graphic = Graphics::FromImage(&bp); graphic->Clear(Color(255, 255, 255, 255)); graphic->SetInterpolationMode(InterpolationModeHighQualityBicubic); graphic->SetSmoothingMode(SmoothingModeHighQuality);//SmoothingModeHighSpeed graphic->SetPixelOffsetMode(PixelOffsetModeHighQuality); graphic->SetCompositingMode(CompositingModeSourceOver); graphic->SetCompositingQuality(CompositingQualityHighQuality); graphic->SetTextRenderingHint(TextRenderingHintAntiAliasGridFit); graphic->DrawImage(SrcImage, RectF(0, 0, rtCut.Width(), rtCut.Height()), rtCut.left, rtCut.top, rtCut.Width(), rtCut.Height(), UnitPixel); delete SrcImage; delete graphic; //delete graphic; //CString strSave; //strSave.Format("%s%s:%s.jpg", lpSaveDirectory,strImageName,strCutScheme); //SaveImageToFile(&bp, strSave); SaveImageToFile(&bp, CString(lpSaveDirectory + strImageName + _T(":") + strCutScheme + _T(".jpg"))); #endif return TRUE; } // 相片后缀:jpg、raw、cr2、NEF 四种常用后缀 //-------------------------------------------------------------------------------- // Remark by Jeff 2014.11.10 // 函数:GetCountOfOrderFolderPhotoFile // 描述:获取订单文件夹下所有相片文件,不含"m"和"s"开头的小图; // 参数:pOrderFolder:订单文件路径; // 返回: // //-------------------------------------------------------------------------------- int GetCountOfOrderFolderPhotoFile( const TCHAR *pOrderFolder, CStringArray &StrPhotoArray) { CStringArray StrSubFoloderArray; using namespace helper_coffs; ffsco o; o.dirs(1); // Jeff.1:查找子目录; o.find(LPCTSTR(pOrderFolder), LPCTSTR(_T("*.*"))); // 可能存在m和s开头的缩略图,需要过滤掉; if (o.count() == 0) return 0; // 获取子目录数; ffsco::typeT coo; ffsco::typeT::iterator it; coo = o.co_dir(); for (it = coo.begin(); it != coo.end(); it++) { if (FindArray(&StrSubFoloderArray, (*it).c_str()) == -1) StrSubFoloderArray.Add((*it).c_str()); } int nIndex = -1; CString strOrderNumberImage; // 获取子目录下的文件数; //CStringArray StrPhotoArray; for (int n = 0; n < StrSubFoloderArray.GetSize(); n++) { ffsco op; op.dirs(0); op.find(LPCTSTR(StrSubFoloderArray.ElementAt(n)), LPCTSTR(_T("*.jpg"))); ffsco::typeT coo; ffsco::typeT::iterator itp; coo = op.co_file(); for (itp = coo.begin(); itp != coo.end(); itp++) { strOrderNumberImage = (*itp).c_str(); nIndex = strOrderNumberImage.ReverseFind('\\'); strOrderNumberImage = strOrderNumberImage.Right(strOrderNumberImage.GetLength() - nIndex -1); if (strOrderNumberImage.Left(1) != _T("m") && strOrderNumberImage.Left(1) != _T("s")) { StrPhotoArray.Add((*itp).c_str()); } } } return 0; } //--------------------------------------------------------------------- // Jeff add 2015.03.26; // 函数:GetFileNameFromFullPath // 描述:从全路径中获取文件名。 // 参数: // lpFullPath:全路径; // 返回: //--------------------------------------------------------------------- VOID GetFileNameFromFullPath(CONST CString &strFullPath, CString &strRet) { // 如果参数空或如果路径不存在; if (strFullPath.IsEmpty() || !PathFileExists(strFullPath)) return; INT nIndex = strFullPath.ReverseFind(_T('\\')); } BOOL LoadMicroShareLibrary() { if (g_hlyfzMicroShareDLL == NULL) g_hlyfzMicroShareDLL = LoadLibrary(_T("lyfzMicroShare.dll")); if (g_hlyfzMicroShareDLL == NULL) { AfxMessageBox(_T("加载微共享模块失败!")); return FALSE; } g_lyfzCreateShare = (lyfzCreateShare)::GetProcAddress(g_hlyfzMicroShareDLL, "lyfzCreateShare"); if (!g_lyfzCreateShare) { FreeLibrary(g_hlyfzMicroShareDLL); g_hlyfzMicroShareDLL = NULL; AfxMessageBox(_T("加载导入导出模块接口失败!")); return FALSE; } return TRUE; } void FreeMicroShareLibrary() { if (g_hlyfzMicroShareDLL) FreeLibrary(g_hlyfzMicroShareDLL); g_hlyfzMicroShareDLL = NULL; g_lyfzCreateShare = NULL; } BOOL OpenShareDirectory() { // 读取remotecfg.dat; if (strcmp(g_szModulePath, _T("")) == 0) return FALSE; TCHAR szdbcfgFile[MAX_PATH] = { _T("") }; sprintf(szdbcfgFile, _T("%s%s"), g_szModulePath, _T("dbconfig.dat")); // 没找到文件; if (!PathFileExists(szdbcfgFile)) return FALSE; // 打开文件,读取内容; CFile cf; CFileException e; if (!cf.Open(szdbcfgFile, CFile::modeRead, &e)) { // 打开文件失败; e.ReportError(); return FALSE; } DBSAVE dbcfg; // 清空STRemoteInfo结构; ZeroMemory(&dbcfg, sizeof(DBSAVE)); INT nCount = cf.Read(&dbcfg, sizeof(DBSAVE)); if (nCount != sizeof(DBSAVE)) { cf.Close(); return FALSE; } // 清除资源; cf.Close(); // 解析数据; TCHAR szHost[51] = {0}; for (int i = 0; i < 50; i++) { if (dbcfg.server[i]) szHost[i] = 500 - dbcfg.server[i];// = 500 - dbcfg.server[i]; if (dbcfg.user[i]) dbcfg.user[i] = 500 - dbcfg.user[i]; if (dbcfg.psw[i]) dbcfg.psw[i] = 500 - dbcfg.psw[i]; } CString strHost = _T(""); strHost.Format(_T("%s"),szHost); strHost.TrimLeft(); strHost.TrimRight("."); strHost.TrimRight(); if (strHost.Find(".ly.com") == -1 && strHost.Find("192.168.") == -1) MyGetIPByName(strHost); // 尝试打开共享目录; TCHAR szShareOriginal[MAX_PATH] = {_T("")}; TCHAR szShareEarly[MAX_PATH] = { _T("") }; TCHAR szShareFurther[MAX_PATH] = { _T("") }; TCHAR szShareDesign[MAX_PATH] = { _T("") }; sprintf(szShareOriginal, _T("\\\\%s\\%s"), strHost, _T("客户原片(管理软件)$")); sprintf(szShareEarly, _T("\\\\%s\\%s"), strHost, _T("修好的片(管理软件)$")); sprintf(szShareFurther, _T("\\\\%s\\%s"), strHost, _T("精修好的片(管理软件)$")); sprintf(szShareDesign, _T("\\\\%s\\%s"), strHost, _T("设计好的片(管理软件)$")); if (!PathFileExists(szShareOriginal) || !PathFileExists(szShareEarly) || !PathFileExists(szShareFurther) || !PathFileExists(szShareDesign) ) return FALSE; return TRUE; } BOOL IsValidDate(LPCTSTR lpDate) // 判断公历; { if (lpDate == NULL || _tcscmp(lpDate, _T("")) == 0) return FALSE; CString strDate = lpDate; if (strDate.IsEmpty()) return FALSE; // 判断日期合法性; static int nYear = 0; static int nMonth = 0; static int nDay = 0; nYear = nMonth = nDay = 0; nYear = _ttoi(strDate.Left(4)); nMonth = _ttoi(strDate.Mid(5, 2)); nDay = _ttoi(strDate.Mid(8, 2)); CONST static INT nNormalMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; CONST static INT nLeapMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if ((nDay <= 0) || (nDay > 31) || (nMonth <= 0) || (nMonth > 12)) return FALSE; if ((nYear % 400 == 0) || (nYear % 4 == 0 && nYear % 100 != 0)) { if (nDay > nLeapMonth[nMonth - 1]) return FALSE; } else { if (nDay > nNormalMonth[nMonth - 1]) return FALSE; } return TRUE; } BOOL IsValidLunanrDate(LPCTSTR lpDate) // 判断农历; { if (lpDate == NULL || _tcscmp(lpDate, _T("")) == 0) return FALSE; CString strDate = lpDate; if (strDate.IsEmpty()) return FALSE; static int lunar_year, lunar_month, lunar_day; lunar_year = lunar_month = lunar_day = 0; lunar_year = _ttoi(strDate.Left(4)); lunar_month = _ttoi(strDate.Mid(5, 2)); lunar_day = _ttoi(strDate.Mid(8, 2)); //越界检查,如果越界,返回无效日期; if (lunar_year <= BEGIN_YEAR || lunar_year > BEGIN_YEAR + NUMBER_YEAR - 1) return FALSE; if (lunar_month < 1 || lunar_month > 12) return FALSE; // 1.农历年是否有闰月; int nYearIndex = lunar_year - BEGIN_YEAR; int leap_month = (LUNAR_YEARS[nYearIndex] >> 20) & 0xF; // 2.月份大小月天数; int month_day = 0; if ((LUNAR_YEARS[nYearIndex] >> (7 + 13 - lunar_month)) & 0x1) month_day = 30; else month_day = 29; if (lunar_day < 0 || lunar_day > month_day) return FALSE; return TRUE; } //************************************// // [函数]: IsExistNumInString // [描述]: 检查是否有数字 // [参数]: // str 字串 // [返回]: 1有数字,0没有 //************************************// int IsExistNumInString(const char* str) { if(str == NULL) return 0; //字符0~9 对应该 ascii码48~57 for(int i=0; i= 48 && str[i] <= 57) return 1; } return 0; } /************************************************************************/ /* 函数:SaveImg2newfile 描述:将Image对象另存为其他格式的文件; 参数: IN: pImg GDI+ Image对象指针,需要保存的图像对象; IN: lpnewfile 其他格式的新文件名(jpg,bmp,png,jpeg); IN: uQuality 另存为新文件时的图像质量值; 返回: 注意:Image::Save 若文件存在,会覆盖存在的文件; */ /************************************************************************/ BOOL SaveImg2newfile(IN Image* pImg, IN CString strNewfile, IN ULONG uQuality) { if (pImg == NULL) return FALSE; // 需要判断路径是否存在,不存在创建目录; int nIndex = strNewfile.ReverseFind(_T('\\')); if (nIndex == -1) return FALSE; if (!PathFileExists(strNewfile.Left(nIndex))) { // 如果文件夹不存在,创建; CreateDirectory(strNewfile.Left(nIndex), NULL); } nIndex = strNewfile.ReverseFind(_T('.')); if (nIndex == -1) return FALSE; Status stat = GenericError; CLSID encoderClsid = { 0 }; BSTR newfile = strNewfile.AllocSysString(); strNewfile = strNewfile.Mid(nIndex + 1); if (strNewfile.CompareNoCase(_T("bmp")) == 0) { GetEncoderClsid(L"image/bmp", &encoderClsid); stat = pImg->Save(newfile, &encoderClsid, NULL); } else if (strNewfile.CompareNoCase(_T("png")) == 0) { GetEncoderClsid(L"image/png", &encoderClsid); stat = pImg->Save(newfile, &encoderClsid, NULL); } else// if ( strNewfile.CompareNoCase(_T("jpeg")) == 0 ) { GetEncoderClsid(L"image/jpeg", &encoderClsid); EncoderParameters encoderParameters; encoderParameters.Count = 1; encoderParameters.Parameter[0].Guid = EncoderQuality; encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong; encoderParameters.Parameter[0].NumberOfValues = 1; // Save the image as a JPEG with quality level 100. encoderParameters.Parameter[0].Value = &uQuality; stat = pImg->Save(newfile, &encoderClsid, &encoderParameters); } SysFreeString(newfile); return stat == Ok ? TRUE : FALSE; } /************************************************************************/ /* 函数:ZoomImg 描述:缩放到指定大小的区域中,返回缩放后的尺寸; 参数: IN: Imgrc 图像的大小; IN: dwDisplayPix 图像要显示的区域的大小; OUT: dwZoomPix 图像在显示区域内缩放后的尺寸; 返回: 注意:dwZoomPix的尺寸必须在dwDisplayPix内; */ /************************************************************************/ int ZoomImg(IN CRect &Imgrc, IN CONST DWORD &dwDisplayPix, OUT DWORD &dwZoomPix) { double fDisplayWidth = GET_XPIX(dwDisplayPix); double fDisplayHeight = GET_YPIX(dwDisplayPix); // 显示区域长宽比; double fDisplayAspectRatio = fDisplayWidth / fDisplayHeight; // 图片长宽比; double fImgAspectRatio = ((double)Imgrc.Width()) / ((double)Imgrc.Height()); double fZoomWidth; double fZoomHeight; if (fDisplayAspectRatio > fImgAspectRatio) { fZoomWidth = fDisplayHeight*fImgAspectRatio; fZoomHeight = fDisplayHeight; } else { fZoomWidth = fDisplayWidth; fZoomHeight = fDisplayWidth / fImgAspectRatio; } dwZoomPix = SET_PIX((int)fZoomWidth, (int)fZoomHeight); ////////////////////////////////////////////////////////////////////////// int nRetval = 0; if ((fDisplayWidth == Imgrc.Width()) && (fDisplayHeight == Imgrc.Height())) { nRetval = ZoomNull; } else if ((fDisplayWidth > Imgrc.Width()) && (fDisplayHeight > Imgrc.Height())) { nRetval = ZoomOut; } else { nRetval = ZoomIn; } return nRetval; } int ZoomImg(IN CONST DWORD &dwImgPix, IN CONST DWORD &dwDisplayPix, OUT DWORD &dwZoomPix) { double fDisplayWidth = GET_XPIX(dwDisplayPix); double fDisplayHeight = GET_YPIX(dwDisplayPix); // 显示区域长宽比; double fDisplayAspectRatio = fDisplayWidth / fDisplayHeight; // 图片长宽比; double fImgAspectRatio = ((double)GET_XPIX(dwImgPix)) / ((double)GET_YPIX(dwImgPix)); double fZoomWidth; double fZoomHeight; if (fDisplayAspectRatio > fImgAspectRatio) { fZoomWidth = fDisplayHeight*fImgAspectRatio; fZoomHeight = fDisplayHeight; } else { fZoomWidth = fDisplayWidth; fZoomHeight = fDisplayWidth / fImgAspectRatio; } dwZoomPix = SET_PIX((int)fZoomWidth, (int)fZoomHeight); ////////////////////////////////////////////////////////////////////////// int nRetval = 0; if ((fDisplayWidth == GET_XPIX(dwImgPix)) && (fDisplayHeight == GET_YPIX(dwImgPix))) { nRetval = ZoomNull; } else if ((fDisplayWidth > GET_XPIX(dwImgPix)) && (fDisplayHeight > GET_YPIX(dwImgPix))) { nRetval = ZoomOut; } else { nRetval = ZoomIn; } return nRetval; } /************************************************************************/ /* 函数:ImgThumbnail 描述:生成高质量的图像缩略图; 参数: IN Image* pImg, 原图指针 IN CONST DWORD &dwDisplayPix, SET_PIX(100,76) = 100*76大小 IN CString strNewfile, 新的图片名 IN ULONG uQuality 缩略图质量0~100 返回: 注意:为了健壮性,strNewfile的路径可以在函数内再次判断是否有效,防止在函数外没有进行经判断; */ /************************************************************************/ BOOL ImgThumbnail(IN Image* pImg, IN CONST DWORD &dwDisplayPix, IN CString strNewfile, IN ULONG uQuality) { if (pImg == NULL) return FALSE; DWORD dwZoomPix; int retval = ZoomImg(SET_PIX(pImg->GetWidth(), pImg->GetHeight()), dwDisplayPix, dwZoomPix); if (retval == ZoomNull) { return SaveImg2newfile(pImg, strNewfile, uQuality); } // 绘制缩略图; Bitmap bitmap(GET_XPIX(dwZoomPix), GET_YPIX(dwZoomPix)); Graphics *graphic = Graphics::FromImage(&bitmap); graphic->Clear(Color(255, 255, 255, 255)); graphic->SetInterpolationMode(InterpolationModeHighQualityBicubic); graphic->SetSmoothingMode(SmoothingModeHighQuality);//SmoothingModeHighSpeed graphic->SetPixelOffsetMode(PixelOffsetModeHighQuality); graphic->SetCompositingMode(CompositingModeSourceOver); graphic->SetCompositingQuality(CompositingQualityHighQuality); graphic->SetTextRenderingHint(TextRenderingHintAntiAliasGridFit); graphic->DrawImage(pImg, 0, 0, GET_XPIX(dwZoomPix), GET_YPIX(dwZoomPix)); delete graphic; // 生成缩略图; return SaveImg2newfile(&bitmap, strNewfile, uQuality); } /************************************************************************/ /* 函数:ImgThumbnail 描述:生成高质量的图像缩略图; 参数: IN LPCTSTR lpImgpath, IN CONST DWORD &dwDisplayPix, IN CString strNewfile, IN ULONG uQuality 返回: 注意:为了健壮性,strNewfile的路径可以在函数内再次判断是否有效,防止在函数外没有进行经判断; */ /************************************************************************/ BOOL ImgThumbnail(IN LPCTSTR lpImgpath, IN CONST DWORD &dwDisplayPix, IN CString strNewfile, IN ULONG uQuality) { if (!PathFileExists(lpImgpath)) return FALSE; #ifdef UNICODE Image Img(lpImgpath); #else BSTR strtmp = _bstr_t(lpImgpath); Image Img(strtmp); SysFreeString(strtmp); #endif DWORD dwZoomPix; int retval = ZoomImg(SET_PIX(Img.GetWidth(), Img.GetHeight()), dwDisplayPix, dwZoomPix); if (retval == ZoomNull) { return SaveImg2newfile(&Img, strNewfile, uQuality); } // 绘制缩略图; Bitmap bitmap(GET_XPIX(dwZoomPix), GET_YPIX(dwZoomPix)); Graphics *graphic = Graphics::FromImage(&bitmap); graphic->Clear(Color(255, 255, 255, 255)); graphic->SetInterpolationMode(InterpolationModeHighQualityBicubic); graphic->SetSmoothingMode(SmoothingModeHighQuality);//SmoothingModeHighSpeed graphic->SetPixelOffsetMode(PixelOffsetModeHighQuality); graphic->SetCompositingMode(CompositingModeSourceOver); graphic->SetCompositingQuality(CompositingQualityHighQuality); graphic->SetTextRenderingHint(TextRenderingHintAntiAliasGridFit); graphic->DrawImage(&Img, 0, 0, GET_XPIX(dwZoomPix), GET_YPIX(dwZoomPix)); delete graphic; // 生成缩略图; return SaveImg2newfile(&bitmap, strNewfile, uQuality); } /*-----------------------------------DES加密解密 模块 begin--------------------------------------------*/ DESEncrypt g_DESEncrypt = NULL; DESDecrypt g_DESDecrypt = NULL; /*-----------------------------------DES加密解密 模块 end--------------------------------------------*/ /*-----------------------------------读取硬件信息 模块 begin--------------------------------------------*/ HMODULE g_hHDSerial = NULL; GetSeiralNumberOrID g_GetSeiralNumberOrID = NULL; GetLocalMacAddr g_GetLocalMacAdd = NULL; BOOL LoadHDSerialLibrary() { if (g_hHDSerial == NULL) g_hHDSerial = LoadLibrary(_T("lyfzHDSerial.dll")); if (g_hHDSerial == NULL) { //dwError = GetLastError(); AfxMessageBox(_T("加载读取硬件信息模块失败!")); return FALSE; } g_GetSeiralNumberOrID = (GetSeiralNumberOrID)::GetProcAddress(g_hHDSerial, "GetSeiralNumberOrID"); g_GetLocalMacAdd = (GetLocalMacAddr)::GetProcAddress(g_hHDSerial, "GetLocalMacAddr"); g_DESEncrypt = (DESEncrypt)::GetProcAddress(g_hHDSerial, "DESEncrypt"); g_DESDecrypt = (DESDecrypt)::GetProcAddress(g_hHDSerial, "DESDecrypt"); if (!g_GetSeiralNumberOrID || !g_GetLocalMacAdd) { AfxMessageBox(_T("加载读取硬件信息模块接口失败!")); return FALSE; } if(!g_DESEncrypt || !g_DESDecrypt) { AfxMessageBox(_T("加载加密解密接口失败!")); return FALSE; } return TRUE; } void FreeHDSerialLibrary() { if (g_hHDSerial) FreeLibrary(g_hHDSerial); g_hHDSerial = NULL; g_GetSeiralNumberOrID = NULL; g_GetLocalMacAdd = NULL; g_DESEncrypt = NULL; g_DESDecrypt = NULL; } /*-----------------------------------读取硬件信息 模块 end--------------------------------------------*/ #ifdef USE_KERNEL_DLL /************************************************************************/ /* 函数:CreateIMGProcess[3/1/2016 IT]; /* 描述:创建lyfzIMGProcess.dll模块实例句柄; /* 参数:; /* 返回:成功返回句柄值,否则返回NULL; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ ImgEnvInterface* CreateIMGProcess( ) { //加载动态库; DWORD dwError = 0; HMODULE hKernelDll = ( HMODULE )LoadLibrary( _T("lyfzIMGProcess.dll") ); if ( hKernelDll ) { //获取创建接口的函数 CREATEIMGPROCESS pInstance = (CREATEIMGPROCESS)GetProcAddress( hKernelDll, "CreateIMGProcess" ); if ( pInstance ) { //创建接口 ImgEnvInterface * pIMGProcess = pInstance( ); //返回接口 return pIMGProcess; } else { dwError = GetLastError(); } } else { dwError = GetLastError(); } if ( ERROR_SUCCESS != dwError ) {// 加载时产生错误; CString strError = _T(""); strError.Format(_T("加载lyfzIMGProcess.dll时出错,出错码=%d"), dwError); WriteTextLog(strError); } return NULL; } ImgEnvInterface *g_pIMGProcess = NULL; /************************************************************************/ /* 函数:GetOrderpathByImgType[3/1/2016 IT]; /* 描述:根据域名和相片类型(原片、初修片、精修片、设计片)来获取全部订单的相片保存路径; /* 参数:; /* [IN] nImgType:相片类型(1 = 原片、2 = 初修片、3 = 精修片、4 = 设计片、5~8备份片); /* [IN] lpBranchId:分店域名; /* [OUT] AryOrderpath:要返回的所有订单的相片共享目录; /* 返回:成功获取目录返回TRUE; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ BOOL GetOrderpathByImgType(IN CONST INT& nImgType, IN LPCTSTR lpBranchId, OUT CStringArray& AryOrderpath) { if ( lpBranchId == NULL || lpBranchId[0] == '\0' || !_tcsstr(lpBranchId, _T(".ly.com"))) { OutputDebugString(lpBranchId); OutputDebugString(_T("\n分店域名无效!\n")); return FALSE; } if ( nImgType > DBImgtype || nImgType < OImgtype ) { OutputDebugString(_T("\n该相片类型不存在!\n")); return FALSE; } if ( g_pIMGProcess == NULL ) return FALSE; CString str; HGLOBAL hMemery; DWORD dwMemSize = 0; hMemery = g_pIMGProcess->GetBranchAllOrderDirectory(nImgType, lpBranchId, dwMemSize); if ( hMemery ) { BYTE *pData = (BYTE*)GlobalLock(hMemery); if ( pData == NULL ) { GlobalUnlock(hMemery); GlobalFree(hMemery); return FALSE; } CMemFile mf; mf.Attach(pData, dwMemSize); CArchive ar(&mf, CArchive::load); AryOrderpath.Serialize(ar); ar.Close(); mf.Detach(); GlobalUnlock(hMemery); GlobalFree(hMemery); return TRUE; } return FALSE; } /************************************************************************/ /* 函数:GetOrderpathByOrderNum[3/1/2016 IT]; /* 描述:根据分店域名、相片类型、订单号来获取订单的全部共享目录; /* 参数:; /* [IN] nImgType:相片类型(1 = 原片、2 = 初修片、3 = 精修片、4 = 设计片、5~8备份片); /* [IN] lpBranchId:分店域名; /* [IN] lpOrderNum:订单号; /* [OUT] AryOrderpath:返回指定订单的相片目录(如果使用多目录共享,结果可能大于1); /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ BOOL GetOrderpathByOrderNum(IN CONST INT& nImgType, IN LPCTSTR lpBranchId, IN LPCTSTR lpOrderNum, OUT CStringArray& AryOrderpath) { if ( lpBranchId == NULL || lpBranchId[0] == '\0' || !_tcsstr(lpBranchId, _T(".ly.com"))) { OutputDebugString(lpBranchId); OutputDebugString(_T("\n分店域名无效!\n")); return FALSE; } if ( nImgType > DBImgtype || nImgType < OImgtype ) { OutputDebugString(_T("\n该相片类型不存在!\n")); return FALSE; } if ( g_pIMGProcess == NULL ) return FALSE; CString str; HGLOBAL hMemery; DWORD dwMemSize = 0; hMemery = g_pIMGProcess->GetOrderAllShareDirectory(nImgType, lpBranchId, lpOrderNum, dwMemSize); if ( hMemery ) { BYTE *pData = (BYTE*)GlobalLock(hMemery); if ( pData == NULL ) { GlobalUnlock(hMemery); GlobalFree(hMemery); return FALSE; } CMemFile mf; mf.Attach(pData, dwMemSize); CArchive ar(&mf, CArchive::load); AryOrderpath.Serialize(ar); ar.Close(); mf.Detach(); GlobalUnlock(hMemery); GlobalFree(hMemery); return TRUE; } return FALSE; } /************************************************************************/ /* 函数:GetScenerypathByOrderNum[3/1/2016 IT]; /* 描述:获取指定订单景点名的全部共享目录; /* 参数:; /* [IN] nImgType:相片类型(1 = 原片、2 = 初修片、3 = 精修片、4 = 设计片、5~8备份片); /* [IN] lpBranchId:分店域名; /* [IN] lpOrderNum:订单号; /* [IN] lpScenery:景点名; /* [OUT] AryScenerypath:返回指定订单的相片目录(如果使用多目录共享,结果可能大于1); /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ BOOL GetScenerypathByOrderNum(IN CONST INT& nImgType, IN LPCTSTR lpBranchId, IN LPCTSTR lpOrderNum, IN LPCTSTR lpScenery, OUT CStringArray& AryScenerypath) { if ( lpBranchId == NULL || lpBranchId[0] == '\0' || !_tcsstr(lpBranchId, _T(".ly.com"))) { OutputDebugString(lpBranchId); OutputDebugString(_T("\n分店域名无效!\n")); return FALSE; } if ( nImgType > DBImgtype || nImgType < OImgtype ) { OutputDebugString(_T("\n该相片类型不存在!\n")); return FALSE; } if ( g_pIMGProcess == NULL ) return FALSE; CString str; HGLOBAL hMemery; DWORD dwMemSize = 0; hMemery = g_pIMGProcess->GetSceneryAllShareDirectory(nImgType, lpBranchId, lpOrderNum, lpScenery, dwMemSize); if ( hMemery ) { BYTE *pData = (BYTE*)GlobalLock(hMemery); if ( pData == NULL ) { GlobalUnlock(hMemery); GlobalFree(hMemery); return FALSE; } CMemFile mf; mf.Attach(pData, dwMemSize); CArchive ar(&mf, CArchive::load); AryScenerypath.Serialize(ar); ar.Close(); mf.Detach(); GlobalUnlock(hMemery); GlobalFree(hMemery); return TRUE; } return FALSE; } /************************************************************************/ /* 函数:GetOrderImgpath[3/1/2016 IT]; /* 描述:获取指定订单号的全部相片路径; /* 参数:; /* [IN] nImgType:相片类型(1 = 原片、2 = 初修片、3 = 精修片、4 = 设计片、5~8备份片); /* [IN] lpBranchId:分店域名; /* [IN] lpOrderNum:订单号; /* [OUT] AryImgpath:返回指定订单的全部相片路径; /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ BOOL GetOrderImgpath(IN CONST INT& nImgType, IN LPCTSTR lpBranchId, IN LPCTSTR lpOrderNum, OUT CStringArray& AryImgpath) { if ( lpBranchId == NULL || lpBranchId[0] == '\0' || !_tcsstr(lpBranchId, _T(".ly.com"))) { OutputDebugString(lpBranchId); OutputDebugString(_T("\n分店域名无效!\n")); return FALSE; } if ( nImgType > DBImgtype || nImgType < OImgtype ) { OutputDebugString(_T("\n该相片类型不存在!\n")); return FALSE; } if ( g_pIMGProcess == NULL ) return FALSE; CString str; DWORD dwMemSize = 0; ImgLoadOrderpathInterface *pOrderLoader = NULL; g_pIMGProcess->QueryInterface(IID_ImgLoadOrderpathInterface,(void**)&pOrderLoader); if ( pOrderLoader ) { HGLOBAL hMemery = pOrderLoader->LoadOrderImages( nImgType, lpBranchId, lpOrderNum, _T("*.jpg|*.jpeg"), dwMemSize); if ( hMemery ) { BYTE *pData = (BYTE*)GlobalLock(hMemery); if ( pData == NULL ) { GlobalUnlock(hMemery); GlobalFree(hMemery); return FALSE; } CMemFile mf; mf.Attach(pData, dwMemSize); CArchive ar(&mf, CArchive::load); AryImgpath.Serialize(ar); ar.Close(); mf.Detach(); GlobalUnlock(hMemery); GlobalFree(hMemery); } pOrderLoader->Release(); return TRUE; } return FALSE; } /************************************************************************/ /* 函数:GetOrderImgpathEx[3/1/2016 IT]; /* 描述:获取指定订单的全部相片路径; /* 参数:; /* [IN] nImgType:相片类型(1 = 原片、2 = 初修片、3 = 精修片、4 = 设计片、5~8备份片); /* [IN] lpBranchId:分店域名; /* [IN] lpOrderNum:订单号; /* [IN] bLoadInSubfolder:是否加载订单目录下的子目录; /* [IN] lpLoadExt:要加载的相片扩展名; /* [IN] lpWithExt:要附加的相片扩展名; /* [IN] AryLoadExtImgpath:指定加载扩展名的相片路径; /* [IN] AryWithExtImgpath:指定附加扩展名的相片路径; /* [IN] AryOrderDirectory:指定订单号的相片共享目录(多目录下可能大于1); /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ BOOL GetOrderImgpathEx(IN CONST INT& nImgType, IN LPCTSTR lpBranchId, IN LPCTSTR lpOrderNum, IN BOOL bLoadInSubfolder, IN LPCTSTR lpLoadExt, IN LPCTSTR lpWithExt, OUT CStringArray& AryLoadExtImgpath, OUT CStringArray& AryWithExtImgpath, OUT CStringArray& AryOrderDirectory ) { if ( lpBranchId == NULL || lpBranchId[0] == '\0' || !_tcsstr(lpBranchId, _T(".ly.com"))) { OutputDebugString(lpBranchId); OutputDebugString(_T("\n分店域名无效!\n")); return FALSE; } if ( nImgType > DBImgtype || nImgType < OImgtype ) { OutputDebugString(_T("\n该相片类型不存在!\n")); return FALSE; } if ( g_pIMGProcess == NULL ) return FALSE; DWORD dwReturnSize = 0; ImgLoadOrderpathExInterface *pOrderLoader = NULL; g_pIMGProcess->QueryInterface(IID_ImgLoadOrderpathExInterface,(void**)&pOrderLoader); if ( pOrderLoader ) { pOrderLoader->Release(); HGLOBAL hMemery = pOrderLoader->LoadOrderImagesEx(nImgType, lpBranchId, lpOrderNum, TRUE, lpLoadExt, lpWithExt, dwReturnSize); if ( hMemery ) { BYTE* pMemery = (BYTE*)GlobalLock(hMemery); if ( pMemery == NULL ) { GlobalUnlock(hMemery); GlobalFree(hMemery); return FALSE; } DWORD dwSize = 0; DWORD dw1 = 0,dw2 = 0,dw3 = 0; CMemFile memfile[3]; memcpy(&dw1, pMemery + dwSize, sizeof(DWORD)); dwSize += sizeof(DWORD); memfile[0].Attach(pMemery+dwSize, dw1); dwSize += dw1; memcpy(&dw2, pMemery + dwSize, sizeof(DWORD)); dwSize += sizeof(DWORD); memfile[1].Attach(pMemery+dwSize, dw2); dwSize += dw2; memcpy(&dw3, pMemery + dwSize, sizeof(DWORD)); dwSize += sizeof(DWORD); memfile[2].Attach(pMemery+dwSize, dw3); dwSize += dw3; CArchive a1(&memfile[0],CArchive::load); CArchive a2(&memfile[1],CArchive::load); CArchive a3(&memfile[2],CArchive::load); AryLoadExtImgpath.Serialize(a1); AryWithExtImgpath.Serialize(a2); AryOrderDirectory.Serialize(a3); a1.Close(); a2.Close(); a3.Close(); memfile[0].Detach(); memfile[1].Detach(); memfile[2].Detach(); if (hMemery) { GlobalUnlock(hMemery); GlobalFree(hMemery); } return TRUE; } } return FALSE; } /************************************************************************/ /* 函数:GetOrderImgpath[3/1/2016 IT]; /* 描述:获取指定订单号的全部相片路径; /* 参数:; /* [IN] nImgType:相片类型(1 = 原片、2 = 初修片、3 = 精修片、4 = 设计片、5~8备份片); /* [IN] lpBranchId:分店域名; /* [IN] lpOrderNum:订单号; /* [IN] lpScenery:景点名或套系名; /* [OUT] AryImgpath:返回指定订单的全部相片路径; /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ BOOL GetSceneryImgpath(IN CONST INT& nImgType, IN LPCTSTR lpBranchId, IN LPCTSTR lpOrderNum, IN LPCTSTR lpScenery, OUT CStringArray& AryImgpath) { if ( lpBranchId == NULL || lpBranchId[0] == '\0' || !_tcsstr(lpBranchId, _T(".ly.com"))) { OutputDebugString(lpBranchId); OutputDebugString(_T("\n分店域名无效!\n")); return FALSE; } if ( nImgType > DBImgtype || nImgType < OImgtype ) { OutputDebugString(_T("\n该相片类型不存在!\n")); return FALSE; } if ( g_pIMGProcess == NULL ) return FALSE; CString str; DWORD dwMemSize = 0; ImgLoadOrderpathInterface *pOrderLoader = NULL; g_pIMGProcess->QueryInterface(IID_ImgLoadOrderpathInterface,(void**)&pOrderLoader); if ( pOrderLoader ) { HGLOBAL hMemery = pOrderLoader->LoadSceneryImages( nImgType, lpBranchId, lpOrderNum, lpScenery, _T("*.jpg|*.jpeg"), dwMemSize); if ( hMemery ) { BYTE *pData = (BYTE*)GlobalLock(hMemery); if ( pData == NULL ) { GlobalUnlock(hMemery); GlobalFree(hMemery); return FALSE; } CMemFile mf; mf.Attach(pData, dwMemSize); CArchive ar(&mf, CArchive::load); AryImgpath.Serialize(ar); ar.Close(); mf.Detach(); GlobalUnlock(hMemery); GlobalFree(hMemery); } pOrderLoader->Release(); return TRUE; } return FALSE; } /************************************************************************/ /* 函数:GetOrderImgpathEx[3/1/2016 IT]; /* 描述:获取指定订单的全部相片路径; /* 参数:; /* [IN] nImgType:相片类型(1 = 原片、2 = 初修片、3 = 精修片、4 = 设计片、5~8备份片); /* [IN] lpBranchId:分店域名; /* [IN] lpOrderNum:订单号; /* [IN] bLoadInSubfolder:是否加载订单目录下的子目录; /* [IN] lpLoadExt:要加载的相片扩展名; /* [IN] lpWithExt:要附加的相片扩展名; /* [IN] AryLoadExtImgpath:指定加载扩展名的相片路径; /* [IN] AryWithExtImgpath:指定附加扩展名的相片路径; /* [IN] AryOrderDirectory:指定订单号的相片共享目录(多目录下可能大于1); /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ BOOL GetSceneryImgpathEx(IN CONST INT& nImgType, IN LPCTSTR lpBranchId, IN LPCTSTR lpOrderNum, IN LPCTSTR lpScenery, IN LPCTSTR lpLoadExt, IN LPCTSTR lpWithExt, OUT CStringArray& AryLoadExtImgpath, OUT CStringArray& AryWithExtImgpath, OUT CStringArray& AryOrderDirectory ) { if ( lpBranchId == NULL || lpBranchId[0] == '\0' || !_tcsstr(lpBranchId, _T(".ly.com"))) { OutputDebugString(lpBranchId); OutputDebugString(_T("\n分店域名无效!\n")); return FALSE; } if ( nImgType > DBImgtype || nImgType < OImgtype ) { OutputDebugString(_T("\n该相片类型不存在!\n")); return FALSE; } if ( g_pIMGProcess == NULL ) return FALSE; DWORD dwReturnSize = 0; ImgLoadOrderpathExInterface *pOrderLoader = NULL; g_pIMGProcess->QueryInterface(IID_ImgLoadOrderpathExInterface,(void**)&pOrderLoader); if ( pOrderLoader ) { pOrderLoader->Release(); HGLOBAL hMemery = pOrderLoader->LoadSceneryImagesEx(nImgType, lpBranchId, lpOrderNum, lpScenery, lpLoadExt, lpWithExt, dwReturnSize); if ( hMemery ) { BYTE* pMemery = (BYTE*)GlobalLock(hMemery); if ( pMemery == NULL ) { GlobalUnlock(hMemery); GlobalFree(hMemery); return FALSE; } DWORD dwSize = 0; DWORD dw1 = 0,dw2 = 0,dw3 = 0; CMemFile memfile[3]; memcpy(&dw1, pMemery + dwSize, sizeof(DWORD)); dwSize += sizeof(DWORD); memfile[0].Attach(pMemery+dwSize, dw1); dwSize += dw1; memcpy(&dw2, pMemery + dwSize, sizeof(DWORD)); dwSize += sizeof(DWORD); memfile[1].Attach(pMemery+dwSize, dw2); dwSize += dw2; memcpy(&dw3, pMemery + dwSize, sizeof(DWORD)); dwSize += sizeof(DWORD); memfile[2].Attach(pMemery+dwSize, dw3); dwSize += dw3; CArchive a1(&memfile[0],CArchive::load); CArchive a2(&memfile[1],CArchive::load); CArchive a3(&memfile[2],CArchive::load); AryLoadExtImgpath.Serialize(a1); AryWithExtImgpath.Serialize(a2); AryOrderDirectory.Serialize(a3); a1.Close(); a2.Close(); a3.Close(); memfile[0].Detach(); memfile[1].Detach(); memfile[2].Detach(); if (hMemery) { GlobalUnlock(hMemery); GlobalFree(hMemery); } return TRUE; } } return FALSE; } #endif // USE_KERNEL_DLL /************************************************************************/ /* 函数:IsDigitString[3/28/2016 IT]; /* 描述:; /* 参数:; /* [IN] :; /* 返回:返回2表示浮点型, 返回1表示整型, 返回-1表示不是数字; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ int IsDigitString(IN CONST CString& str) { int npt = 0; for (int i = 0; i < str.GetLength(); i++) { if (!_istdigit(str.GetAt(i))) { if ( str.GetAt(i) == _T('.') && i != 0) { if ( npt > 1) { return -1; } npt++; } else { return -1; } } } return npt ? 2 : 1; } BOOL Import2Excle(IN CListCtrl *pListCtrl, IN LPCTSTR lpExclePath, IN CONST int& nStartColumn, IN CONST int& nStartRow, IN int nEndColumn, IN int nEndRow) { if ( pListCtrl == NULL || lpExclePath == NULL || nStartColumn < 0 || nStartRow < 0 || (nEndColumn != -1 && nEndColumn <= nStartColumn) || (nEndRow != -1 && nEndRow <= nStartRow) ) { OutputDebugString(_T("参数无效\n")); return FALSE; } if ( pListCtrl->GetItemCount() - nStartRow <= 0 || (nEndRow != -1 && nEndRow >= pListCtrl->GetItemCount())) { OutputDebugString(_T("无中用的行\n")); return FALSE; } // CListCtrl列头信息; CHeaderCtrl* pHeaderCtrl = pListCtrl->GetHeaderCtrl(); if( !pHeaderCtrl ) { OutputDebugString(_T("获取CListCtrl列头失败\n")); return FALSE; } if ( nStartColumn >= pHeaderCtrl->GetItemCount() || ( nEndColumn != -1 && nEndColumn >= pHeaderCtrl->GetItemCount()) ) { OutputDebugString(_T("所选列超出范围\n")); return FALSE; } if ( nEndRow == -1 ) { nEndRow = pListCtrl->GetItemCount(); } if ( nEndColumn == -1 ) { nEndColumn = pHeaderCtrl->GetItemCount(); } // 获取列头字段信息; LVCOLUMN lv; TCHAR szText[MAX_PATH]; lv.mask = LVCF_TEXT; lv.cchTextMax = MAX_PATH; lv.pszText = szText; int i = 0, j = 0; BasicExcel e; e.New(3); e.RenameWorksheet((size_t)0, L"数据1"); BasicExcelWorksheet* sheet1 = e.GetWorksheet(L"数据1"); for( i = nStartColumn, j = 0; i < nEndColumn; i++) { pListCtrl->GetColumn(i, &lv); sheet1->Cell(0,j++)->SetWString(lv.pszText); } // 获取数据内容; int nRet; CString str; int nCurRow = 1, nCurColumn; for ( i = nStartRow; i < nEndRow; i++, nCurRow++ ) { nCurColumn = 0; for ( j = nStartColumn; j < nEndColumn; j++) { #if 0 str = pListCtrl->GetItemText(i, j); // 判断是数个还是字符串; nRet = IsDigitString(str); if ( nRet == 1 ) { nRet = atol(str); if ( nRet != -1 && !str.IsEmpty() && str.GetLength() < 6 ) // 6位长度不转为数字; sheet1->Cell(nCurRow,nCurColumn++)->SetInteger(nRet); else sheet1->Cell(nCurRow,nCurColumn++)->SetWString(str); } else if ( nRet == 2 ) { sheet1->Cell(nCurRow,nCurColumn++)->SetInteger(atof(str)); } else { sheet1->Cell(nCurRow,nCurColumn++)->SetWString(str); } #else str = pListCtrl->GetItemText(i, j); sheet1->Cell(nCurRow,nCurColumn++)->SetWString(str); #endif } } e.SaveAs(lpExclePath); return TRUE; } BOOL Import2Xls(IN CListCtrl *pListCtrl, IN LPCTSTR lpExclePath, IN CONST int& nStartColumn, IN CONST int& nStartRow, IN int nEndColumn, IN int nEndRow) { if ( pListCtrl == NULL || lpExclePath == NULL || nStartColumn < 0 || nStartRow < 0 || (nEndColumn != -1 && nEndColumn <= nStartColumn) || (nEndRow != -1 && nEndRow <= nStartRow) ) { OutputDebugString(_T("参数无效\n")); return FALSE; } if ( pListCtrl->GetItemCount() - nStartRow <= 0 || (nEndRow != -1 && nEndRow >= pListCtrl->GetItemCount())) { OutputDebugString(_T("无中用的行\n")); return FALSE; } // CListCtrl列头信息; CHeaderCtrl* pHeaderCtrl = pListCtrl->GetHeaderCtrl(); if( !pHeaderCtrl ) { OutputDebugString(_T("获取CListCtrl列头失败\n")); return FALSE; } if ( nStartColumn >= pHeaderCtrl->GetItemCount() || ( nEndColumn != -1 && nEndColumn >= pHeaderCtrl->GetItemCount()) ) { OutputDebugString(_T("所选列超出范围\n")); return FALSE; } if ( nEndRow == -1 ) { nEndRow = pListCtrl->GetItemCount(); } if ( nEndColumn == -1 ) { nEndColumn = pHeaderCtrl->GetItemCount(); } // 获取列头字段信息; LVCOLUMN lv; TCHAR szText[MAX_PATH]; lv.mask = LVCF_TEXT; lv.cchTextMax = MAX_PATH; lv.pszText = szText; int i = 0, j = 0; CArray AryData; AryData.SetSize(nEndRow - nStartRow + 1); //AryData.RemoveAll(); AryData.ElementAt(0).RemoveAll(); for( i = nStartColumn, j = 0; i < nEndColumn; i++) { pListCtrl->GetColumn(i, &lv); AryData.ElementAt(0).Add(lv.pszText); } // 获取数据内容; int nRet; CString str; int nCurRow = 1, nCurColumn; for ( i = nStartRow; i < nEndRow; i++, nCurRow++ ) { nCurColumn = 0; AryData.ElementAt(nCurRow).RemoveAll(); for ( j = nStartColumn; j < nEndColumn; j++) { AryData.ElementAt(nCurRow).Add(pListCtrl->GetItemText(i, j)); } } // 将数据序列化到文件中; CMemFile Mef; CArchive ar(&Mef, CArchive::store); for ( i = 0; i < AryData.GetSize(); i++ ) { AryData.ElementAt(i).Serialize(ar); } ar.Close(); DWORD fLength = Mef.GetLength(); PBYTE pData = Mef.Detach(); CFile fb; str.Format(_T("%s.dat"), lpExclePath); if (fb.Open(str, CFile::modeCreate|CFile::modeWrite)) { DWORD dwArySize = nEndRow - nStartRow + 1; fb.Write(&dwArySize, sizeof(DWORD)); fb.Write(pData,fLength); // 写入数组内容; DWORD dwFlag = 889900; fb.Write(&dwFlag,sizeof(DWORD)); // 写入结束标记; fb.Close(); } return TRUE; } TCHAR* GetGuidString() { GUID guid; static TCHAR szBuf[64] = {0}; memset(szBuf, 0, 64*sizeof(TCHAR)); CoInitialize(NULL); if (S_OK == ::CoCreateGuid(&guid)) { sprintf(szBuf, _T("{%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 szBuf; }