Global.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #include "StdAfx.h"
  2. #include "Global.h"
  3. #include "CritSection.h"
  4. #include <locale.h>
  5. namespace Global
  6. {
  7. // 控制台输出;
  8. BOOL g_bStdOut = FALSE;
  9. // 桌面宽度;
  10. INT g_nDesktopWidth = 0;
  11. // 桌面高度;
  12. INT g_nDesktopHeight = 0;
  13. // 任务栏高度;
  14. INT g_nTrayWndHeight = 0;
  15. // x方向刻度;
  16. double g_fScaleX = 0.0;
  17. // y方向刻度;
  18. double g_fScaleY = 0.0;
  19. // 打印或显示设备的预设值和环境值;
  20. DEVMODE g_devMode = {0};
  21. TCHAR g_szModulePath[MAX_PATH] = _T(""); // 软件目录;
  22. TCHAR g_szModuleFileName[MAX_PATH] = _T(""); // 软件名称;
  23. TCHAR g_szConnectString[MAX_PATH] = _T(""); // DB连接串;
  24. // 服务器信息;
  25. TCHAR g_szSvrAddress[MAX_PATH] = _T("");
  26. TCHAR g_szDBSource[MAX_PATH] = _T(""); // 数据库源(服务所在IP或计算机名);
  27. TCHAR g_szDBSourcePort[MAX_PATH] = _T(""); // 数据库源端口;
  28. DWORD g_dwDBServerPort = 0; // 数据库源端口;
  29. TCHAR g_szDBAccount[MAX_PATH] = _T(""); // 数据库登录用户;
  30. TCHAR g_szDBPassWord[MAX_PATH] = _T(""); // 数据库登录密码;
  31. TCHAR g_szDBName[MAX_PATH] = _T(""); // 数据库名称;
  32. TCHAR g_szStudioID[64] = _T(""); // 影楼ID;
  33. DWORD g_dwSvrPort = 0;
  34. DWORD g_dwDBPoolMaxCount = 1; // 数据库连接池最大对象数;
  35. DWORD g_dwDBPoolDef = 1; // 数据库连接池默认对象数;
  36. ModConfig g_ModConfig;
  37. /************************************************************************/
  38. /* 函数:[5/20/2016 IT];
  39. /* 描述:;
  40. /* 参数:;
  41. /* [IN] :;
  42. /* [OUT] :;
  43. /* [IN/OUT] :;
  44. /* 返回:void;
  45. /* 注意:;
  46. /* 示例:;
  47. /*
  48. /* 修改:;
  49. /* 日期:;
  50. /* 内容:;
  51. /************************************************************************/
  52. int GetIniInfo(const TCHAR *szPath, const TCHAR *szIniName)
  53. {
  54. TCHAR szDrive[_MAX_DRIVE] = {0};
  55. TCHAR szDir[_MAX_DIR] = {0};
  56. TCHAR szFName[_MAX_FNAME] = {0};
  57. TCHAR szExt[_MAX_EXT] = {0};
  58. ::GetModuleFileName(NULL, g_szModulePath, sizeof(g_szModulePath) / sizeof(TCHAR));
  59. _stprintf_s(g_szModulePath, MAX_PATH, _T("%s"), g_szModulePath);
  60. _tsplitpath_s(g_szModulePath, szDrive, szDir, szFName, szExt);
  61. _tcscpy_s(g_szModulePath, szDrive);
  62. _tcscat_s(g_szModulePath, szDir);
  63. // -----------------------------------------------------//
  64. TCHAR szIniPath[MAX_PATH] = {0};
  65. if (szPath != NULL && szIniName != NULL)
  66. _stprintf_s(szIniPath, _T("%s%s"), szPath, szIniName);
  67. else
  68. _stprintf_s(szIniPath, _T("%smod.ini"), g_szModulePath);
  69. HANDLE hFile = CreateFile(szIniPath, 0/*GENERIC_READ*/, 0, NULL, OPEN_EXISTING, 0, NULL);
  70. if (ERROR_FILE_NOT_FOUND == GetLastError())
  71. {
  72. _stprintf_s(g_ModConfig.szModSavePath, _T("%smodules_svn.cfg"), g_szModulePath);
  73. WritePrivateProfileString(_T("Mod"), _T("DIR"), g_ModConfig.szModSavePath, szIniPath);
  74. return -1;
  75. }
  76. CloseHandle(hFile);
  77. // 获取服务器端信息;
  78. GetPrivateProfileString(_T("Mod"), _T("DIR"), _T(""), g_ModConfig.szModSavePath, MAX_PATH, szIniPath);
  79. if ( _tcslen(g_ModConfig.szModSavePath) == 0 )
  80. _stprintf_s(g_ModConfig.szModSavePath, _T("%smodules_svn.cfg"), g_szModulePath);
  81. if (!g_bStdOut)
  82. {
  83. g_bStdOut = GetPrivateProfileInt(_T("NetWorkInfo"), _T("StdOut"), 0, szIniPath);
  84. if (g_bStdOut)
  85. {
  86. AllocConsole(); // 开辟控制台;
  87. SetConsoleTitle(_T("调试输出")); // 设置控制台窗口标题;
  88. freopen("CONOUT$", "w+t", stdout); // 重定向输出;
  89. freopen("CONIN$", "r+t", stdin); // 重定向输入;
  90. HWND hWnd = NULL;
  91. again:
  92. hWnd = ::FindWindow(NULL, _T("调试输出"));
  93. if (hWnd)
  94. {
  95. if (!::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE))
  96. {
  97. _tprintf(_T("前置设置失败\n"));
  98. }
  99. else
  100. {
  101. _tprintf(_T("前置设置成功\n"));
  102. }
  103. }
  104. else
  105. {
  106. goto again;
  107. }
  108. }
  109. }
  110. return 0;
  111. }
  112. /************************************************************************/
  113. /* 函数:WriteTextLog[7/28/2016 IT];
  114. /* 描述:写文本日志;
  115. /* 参数:;
  116. /* [IN] :;
  117. /* 返回:void;
  118. /* 注意:;
  119. /* 示例:;
  120. /*
  121. /* 修改:;
  122. /* 日期:;
  123. /* 内容:;
  124. /************************************************************************/
  125. void WriteTextLog(const TCHAR *format, ...)
  126. {
  127. try
  128. {
  129. static ThreadSection _critSection;
  130. AutoThreadSection aSection(&_critSection);
  131. // 解析出日志路径;
  132. TCHAR szlogpath[MAX_PATH] = {0};
  133. static TCHAR szModulePath[MAX_PATH] = {0};
  134. static TCHAR szFna[_MAX_DIR] = { 0 };
  135. if ( szModulePath[0] == _T('\0') )
  136. {
  137. TCHAR szDrive[_MAX_DRIVE] = { 0 };
  138. TCHAR szDir[_MAX_DIR] = { 0 };
  139. TCHAR szExt[_MAX_DIR] = { 0 };
  140. ::GetModuleFileName(NULL, szModulePath, sizeof(szModulePath) / sizeof(TCHAR));
  141. _tsplitpath_s(szModulePath, szDrive, szDir, szFna, szExt);
  142. _tcscpy_s(szModulePath, szDrive);
  143. _tcscat_s(szModulePath, szDir);
  144. }
  145. _stprintf_s(szlogpath, _T("%s%s%s.txt"), szModulePath, szFna, CTime::GetCurrentTime().Format("[%Y-%m-%d]"));
  146. // 打开或创建文件;
  147. CStdioFile fp;
  148. if (PathFileExists(szlogpath))
  149. {
  150. if (fp.Open(szlogpath, CFile::modeWrite) == FALSE)
  151. {
  152. return;
  153. }
  154. fp.SeekToEnd();
  155. }
  156. else
  157. {
  158. if ( !fp.Open(szlogpath, CFile::modeCreate | CFile::modeWrite) )
  159. return;
  160. }
  161. // 格式化前设置语言区域;
  162. TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
  163. _tsetlocale(LC_CTYPE, _T("chs"));//设定中文;
  164. // 格式化日志内容;
  165. va_list args = NULL;
  166. int len = 0;
  167. TCHAR *buffer = NULL;
  168. va_start( args, format );
  169. // _vscprintf doesn't count. terminating '\0'
  170. len = _vsctprintf_p( format, args );
  171. if ( len == -1 )
  172. {
  173. goto clear;
  174. }
  175. len++;
  176. buffer = (TCHAR*)malloc( len * sizeof(TCHAR) );
  177. _vstprintf_s( buffer, len, format, args ); // C4996
  178. // Note: vsprintf is deprecated; consider using vsprintf_s instead
  179. // 将日志内容输入到文件中;
  180. fp.WriteString( CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S ")) );
  181. fp.WriteString(buffer);
  182. fp.WriteString(_T("\n"));
  183. // 关闭文件,释放资源并设置回原语言区域;
  184. free( buffer );
  185. clear:
  186. _tsetlocale(LC_CTYPE, old_locale);
  187. free(old_locale);//还原区域设定;
  188. fp.Close();
  189. }
  190. catch (CException *e)
  191. {
  192. e->ReportError();
  193. e->Delete();
  194. }
  195. }
  196. /************************************************************************/
  197. /* 函数:[10/27/2016 IT];
  198. /* 描述:;
  199. /* 参数:;
  200. /* [IN] :;
  201. /* [OUT] :;
  202. /* [IN/OUT] :;
  203. /* 返回:void;
  204. /* 注意:;
  205. /* 示例:;
  206. /*
  207. /* 修改:;
  208. /* 日期:;
  209. /* 内容:;
  210. /************************************************************************/
  211. TCHAR* GetGuidString()
  212. {
  213. GUID guid;
  214. static TCHAR szBuf[64] = { 0 };
  215. memset(szBuf, 0, 64 * sizeof(TCHAR));
  216. CoInitialize(NULL);
  217. if (S_OK == ::CoCreateGuid(&guid))
  218. {
  219. _stprintf_s(szBuf, 64, _T("%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"),
  220. guid.Data1,
  221. guid.Data2,
  222. guid.Data3,
  223. guid.Data4[0],
  224. guid.Data4[1],
  225. guid.Data4[2],
  226. guid.Data4[3],
  227. guid.Data4[4],
  228. guid.Data4[5],
  229. guid.Data4[6],
  230. guid.Data4[7]
  231. );
  232. }
  233. CoUninitialize();
  234. return szBuf;
  235. }
  236. //增加自动启动注册表项
  237. INT AddAutoSysRun(LPBYTE lpExeFile,CONST DWORD &cbExeFile, LPCTSTR lpKeyName, INT iAutoRunSystem)
  238. {
  239. HKEY hKey = NULL;
  240. DWORD dwErrorCode = 0;
  241. //创建注册表,有该键则读取,无则创建
  242. dwErrorCode = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
  243. _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),
  244. 0,
  245. NULL,
  246. REG_OPTION_NON_VOLATILE,
  247. KEY_ALL_ACCESS, //
  248. //KEY_READ,
  249. NULL, //Security
  250. &hKey,
  251. NULL);
  252. if (dwErrorCode == ERROR_SUCCESS)
  253. {
  254. if (iAutoRunSystem)
  255. {
  256. dwErrorCode = RegSetValueEx(hKey, lpKeyName, NULL, REG_SZ, lpExeFile, cbExeFile);
  257. }
  258. else
  259. {
  260. dwErrorCode = RegDeleteValue(hKey, lpKeyName);
  261. dwErrorCode = RegDeleteKey(hKey, lpKeyName);
  262. }
  263. }
  264. if (NULL != hKey)
  265. RegCloseKey(hKey);
  266. hKey = NULL;
  267. return 0;
  268. }
  269. };