ParkSys.cpp
上传用户:trilite
上传日期:2007-04-24
资源大小:261k
文件大小:8k
源码类别:

酒店行业

开发平台:

Visual C++

  1. // ParkSys.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "ParkSys.h"
  5. #include "MainFrm.h"
  6. #include "ParkSysDoc.h"
  7. #include "ParkSysView.h"
  8. #include "DlgLogin.h"
  9. #include "syncclock.h"
  10. #include "led.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CParkSysApp
  18. BEGIN_MESSAGE_MAP(CParkSysApp, CWinApp)
  19. //{{AFX_MSG_MAP(CParkSysApp)
  20. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  21. ON_COMMAND(ID_SYNCCLOCK, OnSyncclock)
  22. //}}AFX_MSG_MAP
  23. // Standard file based document commands
  24. ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  25. ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
  26. // Standard print setup command
  27. ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CParkSysApp construction
  31. CParkSysApp::CParkSysApp()
  32. {
  33. // TODO: add construction code here,
  34. // Place all significant initialization in InitInstance
  35. hMutex = 0;
  36. }
  37. /////////////////////////////////////////////////////////////////////////////
  38. // The one and only CParkSysApp object
  39. CParkSysApp theApp;
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CParkSysApp initialization
  42. BOOL CParkSysApp::InitInstance()
  43. {
  44. hMutex = CreateMutex(NULL, TRUE, "ParkSysRunExclusively");
  45. if(!(hMutex != 0 && GetLastError() != ERROR_ALREADY_EXISTS))
  46. //an instance is running now, so exit this instance
  47. {
  48. AfxMessageBox("程序已经在运行,请用ALT+TAB切换到活动的系统!");
  49. return FALSE; 
  50. }
  51. AfxEnableControlContainer();
  52. // Standard initialization
  53. // If you are not using these features and wish to reduce the size
  54. //  of your final executable, you should remove from the following
  55. //  the specific initialization routines you do not need.
  56. #ifdef _AFXDLL
  57. Enable3dControls(); // Call this when using MFC in a shared DLL
  58. #else
  59. Enable3dControlsStatic(); // Call this when linking to MFC statically
  60. #endif
  61. //打开数据库
  62. TRY
  63. {
  64. database.Open( "DSN_Vicaly",
  65. FALSE, FALSE,
  66. "ODBC;UID=sa;PWD=" );
  67. //database.SetSynchronousMode(TRUE);
  68. }
  69. CATCH(CDBException, e)
  70. {
  71. TRY
  72. {
  73. CString str;
  74. str.LoadString(IDS_DATABASE_DSN);
  75. database.OpenEx(str,
  76. CDatabase::useCursorLib | CDatabase::forceOdbcDialog);
  77. }
  78. CATCH_ALL(e1)
  79. {
  80. AfxMessageBox(_T("不能打开系统数据库!n"), MB_ICONSTOP);
  81. return FALSE;
  82. }
  83. END_CATCH_ALL
  84. }
  85. END_CATCH
  86. //Victor Lee Add the following code, in order to 
  87. //synchronize the clocks on server and workstation
  88. CSyncClock SyncClock(&theApp.database);
  89. SyncClock.Open();
  90. CTime dtServer = SyncClock.m_datetimeServer;
  91. SyncClock.Close();
  92. CTime dtClient = CTime::GetCurrentTime();
  93. CString strMsg = "本机时间与服务器上的不一致。nr 服务器:";
  94. strMsg += dtServer.Format("%Y-%m-%d %H:%M:%S");
  95. strMsg += "nr 本机:";
  96. strMsg += dtClient.Format("%Y-%m-%d %H:%M:%S");
  97. strMsg += "nr确认后,系统会自动同步!";
  98. CTimeSpan timeSpan = dtServer - dtClient;
  99. if ( timeSpan.GetTotalSeconds() > 30 ) 
  100. //误差小于30秒认为是同步。
  101. {
  102. if (AfxMessageBox(strMsg, MB_OKCANCEL | MB_ICONINFORMATION) == IDOK)
  103. {
  104. SyncClock.Open();
  105. CTime dtServer = SyncClock.m_datetimeServer;
  106. SyncClock.Close();
  107. //将本机时间设成与服务器同步
  108. CSyncClock::SetSystemTime(dtServer);
  109. }
  110. else
  111. return FALSE;
  112. }
  113. CDlgLogin dlg;
  114. int nResponse = dlg.DoModal();
  115. if (nResponse == IDOK)
  116. {
  117. }
  118. else if (nResponse == IDCANCEL)
  119. {
  120. return FALSE;
  121. }
  122. // Change the registry key under which our settings are stored.
  123. // You should modify this string to be something appropriate
  124. // such as the name of your company or organization.
  125. SetRegistryKey(_T("Local AppWizard-Generated Applications"));
  126. LoadStdProfileSettings();  // Load standard INI file options (including MRU)
  127. // Register the application's document templates.  Document templates
  128. //  serve as the connection between documents, frame windows and views.
  129. CSingleDocTemplate* pDocTemplate;
  130. pDocTemplate = new CSingleDocTemplate(
  131. IDR_MAINFRAME,
  132. RUNTIME_CLASS(CParkSysDoc),
  133. RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  134. RUNTIME_CLASS(CParkSysView));
  135. AddDocTemplate(pDocTemplate);
  136. // Parse command line for standard shell commands, DDE, file open
  137. CCommandLineInfo cmdInfo;
  138. ParseCommandLine(cmdInfo);
  139. // Dispatch commands specified on the command line
  140. if (!ProcessShellCommand(cmdInfo))
  141. return FALSE;
  142. // The one and only window has been initialized, so show and update it.
  143. m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
  144. m_pMainWnd->UpdateWindow();
  145. CMainFrame* p = (CMainFrame*)AfxGetMainWnd();
  146. p_view = p->GetActiveView();
  147. AfxGetMainWnd()->SetWindowText("停车场管理系统");
  148. //阅读器
  149. CParkSysView* p1=(CParkSysView*)p_view;
  150. //显示视频
  151. //计算位置
  152. CRect staticClient;
  153. CWnd* pWnd = p_view->GetDlgItem(IDC_STATICENINFO);
  154. pWnd->GetWindowRect(&staticClient);
  155. CRect rcClip;
  156. p_view->GetWindowRect(&rcClip);
  157. BOOL rel = avi.capInit((CWnd*)p_view,staticClient.left+18,
  158. staticClient.top - rcClip.top + 20,270,200, 
  159. AVI_WINDOW_INID, 0);
  160. return TRUE;
  161. }
  162. /////////////////////////////////////////////////////////////////////////////
  163. // CAboutDlg dialog used for App About
  164. class CAboutDlg : public CDialog
  165. {
  166. public:
  167. CAboutDlg();
  168. // Dialog Data
  169. //{{AFX_DATA(CAboutDlg)
  170. enum { IDD = IDD_ABOUTBOX };
  171. //}}AFX_DATA
  172. // ClassWizard generated virtual function overrides
  173. //{{AFX_VIRTUAL(CAboutDlg)
  174. protected:
  175. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  176. //}}AFX_VIRTUAL
  177. // Implementation
  178. protected:
  179. //{{AFX_MSG(CAboutDlg)
  180. //}}AFX_MSG
  181. DECLARE_MESSAGE_MAP()
  182. };
  183. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  184. {
  185. //{{AFX_DATA_INIT(CAboutDlg)
  186. //}}AFX_DATA_INIT
  187. }
  188. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  189. {
  190. CDialog::DoDataExchange(pDX);
  191. //{{AFX_DATA_MAP(CAboutDlg)
  192. //}}AFX_DATA_MAP
  193. }
  194. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  195. //{{AFX_MSG_MAP(CAboutDlg)
  196. //}}AFX_MSG_MAP
  197. END_MESSAGE_MAP()
  198. // App command to run the dialog
  199. void CParkSysApp::OnAppAbout()
  200. {
  201. CAboutDlg aboutDlg;
  202. aboutDlg.DoModal();
  203. }
  204. /////////////////////////////////////////////////////////////////////////////
  205. // CParkSysApp commands
  206.                                  
  207. CString CParkSysApp::ExtractFilePath()
  208. {
  209. TCHAR exeFullPath[MAX_PATH]; // MAX_PATH在API中定义了吧,好象是128
  210. GetModuleFileName(NULL,exeFullPath,MAX_PATH);
  211. CString strFullPath(exeFullPath);
  212. strFullPath.TrimRight();
  213. strFullPath.TrimLeft();
  214. return strFullPath.Left(strFullPath.ReverseFind('\') + 1);
  215. }
  216. int CParkSysApp::ExitInstance() 
  217. {
  218. // TODO: Add your specialized code here and/or call the base class
  219. ASSERT(hMutex);
  220. CloseHandle(hMutex); //Close the mutex for next time running
  221. return CWinApp::ExitInstance();
  222. }
  223. void CParkSysApp::OnSyncclock() 
  224. {
  225. // TODO: Add your command handler code here
  226. CSyncClock syncClock(&theApp.database);
  227. syncClock.Open();
  228. CTime dtServer = syncClock.m_datetimeServer;
  229. syncClock.Close();
  230. //将本机时间设成与服务器同步
  231. CSyncClock::SetSystemTime(dtServer);
  232. AfxMessageBox("本地机器的时钟被服务器同步。");
  233. }
  234. HANDLE CParkSysApp::ExecApp(const CString& strCommandLine, LPPROCESS_INFORMATION lpProcessinfo, LPSTARTUPINFO lpStartinfo)
  235. {
  236. STARTUPINFO startinfo;
  237. ZeroMemory(&startinfo, sizeof(STARTUPINFO));
  238. startinfo.cb = sizeof(STARTUPINFO);
  239. if(lpStartinfo == NULL)
  240. {
  241. lpStartinfo = &startinfo;
  242. }
  243. PROCESS_INFORMATION processinfo;
  244. if(lpProcessinfo == NULL)
  245. {
  246. lpProcessinfo = &processinfo;
  247. }
  248. // TODO: Add your control notification handler code here
  249. char szCmd[300];
  250. wsprintf(szCmd, "%s", strCommandLine);
  251. if (!CreateProcess(NULL,
  252. szCmd,
  253. NULL, 
  254. NULL,
  255. FALSE,
  256. CREATE_NEW_PROCESS_GROUP,
  257. NULL,
  258. NULL,
  259. lpStartinfo,
  260. lpProcessinfo)) 
  261. {
  262. AfxMessageBox("调用失败,参数为: " + strCommandLine);
  263. AfxThrowUserException();
  264. return HANDLE(0);
  265. }
  266. else
  267. {
  268. return HANDLE(lpProcessinfo->hProcess);
  269. }
  270. }