#include "stdafx.h" #include "DBServer.h" #include "DBServerDlg.h" #include "theDBServer.h" #include "MyLock.h" #include "mysqldata.h" #include "DumpCollect.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif BEGIN_MESSAGE_MAP(CDBServer, CWinApp) //{{AFX_MSG_MAP(CDBServer) ON_COMMAND(ID_APP_SHOW, OnAppShow) ON_COMMAND(ID_APP_EXIT, OnAppExit) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_HELP_INDEX, OnHelpIndex) //}}AFX_MSG_MAP ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDBServer construction CDBServer::CDBServer() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CDBServer object CDBServer theApp; CtheDBServer theServer; ///////////////////////////////////////////////////////////////////////////// // CDBServer initialization BOOL CDBServer::InitInstance() { AfxInitRichEdit2(); CWinApp::InitInstance(); AfxEnableControlContainer(); DumpCollect::InitMinDump(); InitSocketLibrary(MAKEWORD(2,2)); // 2.配置数据库连接信息; char server[50]; DWORD leng=50; memset(server, 0, 50); ::GetComputerName(server, &leng); _stprintf_s(g_szHostName, MAX_PATH, _T("%s"), server); g_localname = server; TCHAR szDir[MAX_PATH]; ::GetModuleFileName(NULL, szDir, MAX_PATH); g_mainpath = szDir; g_mainpath = g_mainpath.Left (g_mainpath.ReverseFind ('\\')); if( GetIniInfo() == -1) { WriteTextLog("未找到配置文件:ServiceInfo.ini"); return FALSE; } // 服务器延时启动; if ( g_dwStartDelayTime ) { Sleep(g_dwStartDelayTime*1000); } // 1.根据运行的端口号来运行单实例; _stprintf_s(szDir, _T("lyfzServer%d"), g_dwCSPort); HANDLE hObject = CreateMutex(NULL, FALSE, szDir); if(GetLastError() == ERROR_ALREADY_EXISTS) { return false; } g_strdbpsw.Format("uid=%s;pwd=%s",g_szDBAccount,g_szDBPassWord); if ( g_dwDBServerPort != 0 ) g_strdbServrename.Format("%s,%d",g_szDBSource,g_dwDBServerPort); else g_strdbServrename.Format("%s",g_szDBSource); WriteTextLog("启动"); // 3.初始化加密狗信息,并获取相应的加密数据; MyLock lock("ytSoftKeyaccessxiao"); if(ytSoftKey.IniEx()) { AfxMessageBox(_T("未找到加密狗或加密狗版本不一致!")); return false; } #ifdef CONNCOUNT_VERSION // Jeff.座席版; { int value[8]; double f[8]; TCHAR s0[50]=_T(""),s1[50]=_T(""),s2[50]=_T(""),s3[50]=_T(""),s4[50]=_T(""),s5[50]=_T(""),s6[50]=_T(""),s7[50]=_T(""); //运行自定义函数 int ret=ytSoftKey.getdata(&value[0],&value[1],&value[2],&value[3],&value[4],&value[5],&value[6],&value[7], &f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&f[6],&f[7], s0,s1,s2,s3,s4,s5,s6,s7); if(ret!=0 && ret!=-43) { g_conncount=-1; // Jeff:S0 存储着座席数量; } else { g_conncount=atoi(s0); // Jeff:S0 存储着座席数量; g_sdomain=s1; g_bReg=atoi(s2); // ???医院跟踪系统?? } } #else { int value[8]; double f[8]; TCHAR s0[50]=_T(""),s1[50]=_T(""),s2[50]=_T(""),s3[50]=_T(""),s4[50]=_T(""),s5[50]=_T(""),s6[50]=_T(""),s7[50]=_T(""); //运行自定义函数 int ret=ytSoftKey.getdata(&value[0],&value[1],&value[2],&value[3],&value[4],&value[5],&value[6],&value[7], &f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&f[6],&f[7], s0,s1,s2,s3,s4,s5,s6,s7); if(ret!=0 && ret!=-43) { } else { g_sdomain=s1; g_bReg=atoi(s2); } } #endif if ( g_sdomain.IsEmpty() ) { AfxMessageBox(_T("加密锁域名为空,无法启动服务器!")); return FALSE; } CString savedir=g_mainpath+"\\数据备份"; if(!CheckFolderFileExist (savedir)) ::CreateDirectory (savedir, NULL); ::CoInitialize( NULL ); BOOL bMasterDb=0; BOOL bUserDb=0; // 4.连接master数据库,判断数据库连接是否正常; CDatabase masterdb; // Jeff:master用于附加与分离数据库; try { TCHAR szConnectString[MAX_PATH] = _T(""); if( g_dwDBServerPort != 0) { if ( _tcscmp(g_szDBAccount, _T("")) == 0 ) _stprintf_s(szConnectString, DB_SW_CONN_WITH_PORT, g_szDBSource,g_dwDBServerPort, _T("master")); else _stprintf_s(szConnectString, DB_SS_CONN_WITH_PORT,g_szDBSource,g_dwDBServerPort, _T("master"), g_szDBAccount,g_szDBPassWord); } else { if ( _tcscmp(g_szDBAccount, _T("")) == 0 ) _stprintf_s(szConnectString, DB_SW_CONN_WITHOUT_PORT, g_szDBSource, _T("master")); else _stprintf_s(szConnectString, DB_SS_CONN_WITHOUT_PORT, g_szDBSource, _T("master"), g_szDBAccount, g_szDBPassWord); } masterdb.OpenEx(szConnectString,CDatabase::noOdbcDialog); bMasterDb=1; } catch(CDBException * e) { #ifdef _DEBUG e->ReportError(); #endif e->Delete(); } if(bMasterDb==0) { WriteTextLog(_T("sql数据库未启动!")); ShellExecute(NULL, _T("open"), g_mainpath+"\\AutoRun.exe", NULL, NULL, SW_HIDE); return false; } CODBCPool *pdbpool = new CODBCPool; if ( pdbpool->InitializePool(g_szDBSource, g_dwDBServerPort, g_szDBAccount, g_szDBPassWord, g_szDBName, g_dwDBPoolDef, g_dwDBPoolMaxCount) ) { g_dbpool.Add(pdbpool); bUserDb=1; BackupDatabase(savedir, 1, 0); // Jeff. savedir=\\数据备份 CDatabase *pdb = NULL; ODBCConnGuard ConnGuard(pdb, -1, 3000); CString strSQL; strSQL.Format(_T("update path set path1='%s'"), g_sdomain); if ( pdb ) { try { pdb->ExecuteSQL(strSQL); pdb->ExecuteSQL(_T("IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[historydb]') AND type in (N'U')) CREATE TABLE [historydb]([year] VARCHAR(50))")); } catch (CDBException* e) { WriteTextLog(_T("%s-<%d>-%s,%s"), __FILE__, __LINE__, __FUNCTION__, e->m_strError); e->Delete(); } } } else { delete pdbpool; } if(bUserDb==0 && bMasterDb) { CString autorunpath=g_mainpath+"\\AutoRun.exe"; ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE); WriteTextLog("数据库初始化中..."); TCHAR szDBFile[MAX_PATH] = _T(""); _stprintf_s(szDBFile, _T("%s\\数据\\%s.mdf"), g_mainpath.GetString(), g_szDBName); if(::PathFileExists(szDBFile) == 0 ) { WriteTextLog("数据库文件丢失!"); return false; } BOOL bLog=0; TCHAR szDBLogFile[MAX_PATH] = _T(""); _stprintf_s(szDBLogFile, _T("%s\\数据\\%s_log.ldf"), g_mainpath.GetString(), g_szDBName); if(::PathFileExists(szDBLogFile) == 0 ) { bLog=1; } CString sql; try { // g_masterdb.ExecuteSQL ("exec sp_detach_db db"); } catch(CDBException * e) { #ifdef _DEBUG e->ReportError(); #endif e->Delete(); } if(bLog) sql.Format("exec sp_attach_db '%s',@filename1='%s\\数据\\%s.mdf',@filename2='%s\\数据\\%s_log.ldf'",g_szDBName,g_ModulePath,g_szDBName,g_ModulePath,g_szDBName); else sql.Format("exec sp_attach_db '%s',@filename1='%s\\数据\\%s.mdf'", g_szDBName,g_ModulePath,g_szDBName); try { masterdb.ExecuteSQL (sql); // 同master数据库去执行附加和分离; } catch(CDBException * e) { masterdb.Close(); WriteTextLog(e->m_strError); WriteTextLog("数据库初始化失败!"); #ifdef _DEBUG e->ReportError(); #endif e->Delete(); return false; } masterdb.Close(); WriteTextLog("数据库初始化完成,请重新启动系统!"); return false; } // 在数据库完成初始化后,判断本地目录下是否有MSCHRT20.OCX文件,无则从数据库下载;2014.09.06 // 客户端从dwToUserID==211里传递MSCHRT20.OCX; CString strMSCHRTOCX = g_mainpath+"\\系统文件\\MSCHRT20.OCX"; OFSTRUCT ofStruct; OpenFile(strMSCHRTOCX,&ofStruct,OF_EXIST); if( ERROR_FILE_NOT_FOUND == GetLastError()) { CDatabase *pdb = NULL; ODBCConnGuard ConnGuard(pdb, -1, 3000); if ( pdb ) { CRstUpdate rsSt; rsSt.m_pDatabase = pdb; rsSt.Open(); if(!rsSt.IsEOF()) { CFile fp; if(fp.Open(strMSCHRTOCX, CFile::modeCreate|CFile::modeWrite)) { void *pData = GlobalLock(rsSt.m_lbOCX.m_hData); fp.Write(pData, rsSt.m_lbOCX.m_dwDataLength); fp.Close(); GlobalUnlock(rsSt.m_lbOCX.m_hData); } } rsSt.Close(); } } ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); CString path1="客户原片(管理软件)$"; CString path2="修好的片(管理软件)$"; CString path3="设计好的片(管理软件)$"; CString path4="精修好的片(管理软件)$"; CString path5="礼服图片(管理软件)$"; CString path6="电话录音(管理软件)$"; CString temp; if(CheckFolderFileExist (g_mainpath+"\\"+path1)) { temp.Format ("net share %s=%s\\%s", path1, g_mainpath, path1); WinExec(temp,SW_HIDE); } if(CheckFolderFileExist (g_mainpath+"\\"+path2)) { temp.Format ("net share %s=%s\\%s", path2, g_mainpath, path2); WinExec(temp,SW_HIDE); } if(CheckFolderFileExist (g_mainpath+"\\"+path3)) { temp.Format ("net share %s=%s\\%s", path3, g_mainpath, path3); WinExec(temp,SW_HIDE); } if(CheckFolderFileExist (g_mainpath+"\\"+path4)) { temp.Format ("net share %s=%s\\%s", path4, g_mainpath, path4); WinExec(temp,SW_HIDE); } if(CheckFolderFileExist (g_mainpath+"\\"+path5)) { temp.Format ("net share %s=%s\\%s", path5, g_mainpath, path5); WinExec(temp,SW_HIDE); } if(CheckFolderFileExist (g_mainpath+"\\"+path6)) { temp.Format ("net share %s=%s\\%s", path6, g_mainpath, path6); WinExec(temp,SW_HIDE); } CString autorunpath=g_mainpath+"\\AutoRun.exe"; ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE); #ifdef ENTERPRISE_VERSION autorunpath=g_mainpath+"\\DataSyncReceive.exe"; ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE); autorunpath=g_mainpath+"\\DataSyncSend.exe"; ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE); autorunpath=g_mainpath+"\\CPhotoFTPReceive.exe"; ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE); autorunpath=g_mainpath+"\\CPhotoFTPSend.exe"; ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE); #endif // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif InitCommonControls(); CDBServerDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { } else if (nResponse == IDCANCEL) { } GdiplusShutdown(gdiplusToken); g_Instance = AfxGetResourceHandle(); return FALSE; } void CDBServer::OnAppShow() { if (m_pMainWnd) m_pMainWnd->ShowWindow(SW_SHOW); } void CDBServer::OnAppExit() { //御载lyfzBackupModle.dll m_pMainWnd->DestroyWindow(); } void CDBServer::OnAppAbout() { } /********************************************************************/ /* */ /* Function name : OnHelpIndex */ /* Description : Command to show help file. */ /* */ /********************************************************************/ void CDBServer::OnHelpIndex() { // launch help // ::WinHelp(AfxGetMainWnd()->m_hWnd, AfxGetApp()->m_pszHelpFilePath, HELP_CONTENTS, 0L); } int CDBServer::ExitInstance() { // 释放Socket库; ReleaseSocketLibrary(); return CWinApp::ExitInstance(); }