unit DeCrmHeInstMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Imaging.pngimage, PngImageList, System.ImageList, Vcl.ImgList, Vcl.WinXPanels, Vcl.ComCtrls, VirtualTrees; type PInstEnt = ^TInstEnt; TInstEnt = record sName, sDesc: String; end; TDlgeCrmHeInstMain = class(TForm) seMain: TShape; Label1: TLabel; imgLogo: TImage; imgProg: TImage; imgMain: TImage; imgInstall: TImage; imgMin: TImage; imgExit: TImage; imgNext: TImage; imgPrev: TImage; imgBtns: TPngImageList; imgProgs: TPngImageCollection; imgBtns2: TPngImageList; cpMain: TCardPanel; cdWelcome: TCard; Label2: TLabel; Label3: TLabel; Label4: TLabel; cdLicense: TCard; Label5: TLabel; Label6: TLabel; mmLicense: TMemo; rdAgree: TRadioButton; rdNoAgree: TRadioButton; cdInfo: TCard; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; edEmpNo: TEdit; edVpnId: TEdit; cdInstall: TCard; Label11: TLabel; imgProcess: TImage; Label12: TLabel; pg: TProgressBar; vtList: TVirtualStringTree; cdCompleted: TCard; lbCompleted: TLabel; lbCompletedMsg: TLabel; lbExitMsg: TLabel; tExit: TTimer; cdInstalled: TCard; imgBtnInit: TPngImageCollection; imgDelete: TImage; imgReinstall: TImage; Label15: TLabel; Label16: TLabel; imgInstalled: TImage; procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure imgMinClick(Sender: TObject); procedure imgExitClick(Sender: TObject); procedure imgMinMouseEnter(Sender: TObject); procedure imgMinMouseLeave(Sender: TObject); procedure imgPrevMouseEnter(Sender: TObject); procedure imgPrevMouseLeave(Sender: TObject); procedure imgNextClick(Sender: TObject); procedure imgPrevClick(Sender: TObject); procedure rdAgreeClick(Sender: TObject); procedure rdNoAgreeClick(Sender: TObject); procedure tExitTimer(Sender: TObject); procedure imgDeleteMouseEnter(Sender: TObject); procedure imgDeleteMouseLeave(Sender: TObject); procedure imgReinstallClick(Sender: TObject); procedure imgDeleteClick(Sender: TObject); procedure vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); procedure vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vtListGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: string); procedure vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); procedure edVpnIdKeyPress(Sender: TObject; var Key: Char); private { Private declarations } procedure SetImgBtn(aImgList: TPngImageList; imgBtn: TImage; nImgIdx: Integer); procedure SetImgCtrl(aImgList: TPngImageCollection; imgCtrl: TImage; nImgIdx: Integer); public { Public declarations } Constructor Create(aOwner: TComponent); override; procedure process_WM_SYSCOMMAND(var msg: TWMSysCommand); Message WM_SYSCOMMAND; end; function ProcessInstall(aInstForm: TDlgeCrmHeInstMain; bStartSvc: Boolean = false): Boolean; var DlgeCrmHeInstMain: TDlgeCrmHeInstMain; implementation uses Define, Tocsg.Path, ProcessUninstall, GlobalDefine, Tocsg.VirtualTreeViewUtil, Tocsg.Safe, Tocsg.Exception, System.Zip, ManagerModel, Tocsg.Service, Winapi.WinSvc, Tocsg.Process, superobject, Tocsg.Shell, Tocsg.Files; {$R *.dfm} var _nExitSec: Integer = 5; function ProcessInstall(aInstForm: TDlgeCrmHeInstMain; bStartSvc: Boolean = false): Boolean; procedure AddInstEnt(sName, sDesc: String); var pData: PInstEnt; begin if aInstForm <> nil then begin pData := VT_AddChildData(aInstForm.vtList); pData.sName := sName; pData.sDesc := sDesc; aInstForm.pg.Position := aInstForm.pg.Position + 1; Application.ProcessMessages; end; end; var sSysDir, sInstDir, sResPath: String; AgentModel: TAgentModel; function GetRes(sId: String): Boolean; var res: TResourceStream; begin Result := false; if FileExists(sResPath) then DeleteFile(sResPath); try res := TResourceStream.Create(HInstance, sId, 'raw'); if res <> nil then begin res.SaveToFile(sResPath); res.Free; Result := true; end; except on E: Exception do ETgException.TraceException(E, Format('Fail .. GetRes(), ID="%s"', [sId])); end; end; function ExtrZip(sDestDir: String; bIgrErr: Boolean = false): Boolean; begin Result := bIgrErr or false; if ForceDirectories(sDestDir) then begin try TZipFile.ExtractZipFile(sResPath, sDestDir); Result := true; except on E: Exception do ETgException.TraceException(E, Format('Fail .. ExtrZip(), ExtrDir="%s"', [sDestDir])); end; end; end; var ProcInfo: TProcessInformation; begin Result := false; if aInstForm <> nil then begin aInstForm.pg.Position := 0; aInstForm.pg.Max := 6; end else begin // ±âÁ¸¿¡ ¼³Ä¡µÈ°Ô ¾ø´Ù¸é ¹«½Ã 22_0517 14:24:38 kku sInstDir := GetProgramFilesDir + DIR_HE; if not DirectoryExists(sInstDir) then exit; if not FileExists(sInstDir + 'conf\' + DAT_AGENT) and not FileExists(sInstDir + 'conf\' + PROP_USERINFO) then exit; end; try ZeroMemory(@ProcInfo, SizeOf(ProcInfo)); if GetProcessPidByName(EXE_HE) <> 0 then begin // ±¸¹öÀü¿¡¼­ ¼³Ä¡¸¦ À§ÇØ EXE_HE ¸®¼Ò½º¸¦ ¹Ì¸® ÃßÃâÇÑ´Ù 22_0517 13:59:04 kku sInstDir := GetProgramFilesDir + DIR_TG; if ForceDirectories(sInstDir) then begin sResPath := sInstDir + '$InstData'; if not GetRes('RS_HEBIN') then exit; if not ExtrZip(sInstDir + 'Temp\') then exit; DeleteFile(sResPath); if CopyFile(PChar(sInstDir + 'Temp\' + EXE_HE), PChar(sInstDir + EXE_HE), false) then begin Sleep(500); DeleteDir(sInstDir + 'Temp\', true, true); // ½ÇÇàÁß À缳ġ¶ó¸é EXE_HE Á״°Šº¸°í VPNÀÌ µû¶ó Á×Áö ¾Êµµ·Ï ´õ¹Ì¸¦ ¶ç¿öÁØ´Ù. 22_0511 15:26:13 kku var sCurPath: String := sInstDir + EXE_HE; if FileExists(sCurPath) then begin Sleep(1000); var O: ISuperObject := SO; O.I['M'] := 11; // MODE_DUMMY O.B['SD'] := true; O.S['AM'] := MUTEX_INSTALLER; var sParam: String := GetRunExePathDir + 'reqprm.json'; if SaveJsonObjToFile(O, sParam) then ProcInfo := ExecuteAppAsUser(GetCurrentProcessId, sCurPath, Format('-i "%s"', [sParam]), SW_HIDE) else DeleteFile(sCurPath); end; end; end; end; AddInstEnt('Tocsg.Installation.Initator', 'Initiate application check'); UninstallCrmHE(ProcInfo.dwProcessId, aInstForm = nil {true = ÆÐÄ¡}); sInstDir := GetProgramFilesDir + DIR_HE; if not ForceDirectories(sInstDir) then exit; sResPath := sInstDir + '$InstData'; AddInstEnt('Tocsg.Installation.Service', 'Service check'); if GetRes('RS_KVBIN') then begin // ÀÌ°Ç ÆÐÄ¡ÀÇ °æ¿ì ¾øÀ» ¼ö ÀÖ´Ù. 22_0517 16:39:29 kku ExtrZip(sInstDir + 'bin\'); // if not ExtrZip(sInstDir + 'bin\') then // exit; end; AddInstEnt('Tocsg.Installation.Component', 'Component check'); if not GetRes('RS_CONF') then exit; if not ExtrZip(sInstDir + 'conf\') then exit; AddInstEnt('Tocsg.Installation.LiceseMgr', 'License check'); if not GetRes('RS_HEBIN') then exit; if not ExtrZip(sInstDir) then exit; // MG.exe¿¡¼­ »ç¿ëÇÒ°Å °°Àº? DLL ¹èÆ÷ if not GetRes('RS_DLLS') then exit; sSysDir := GetSystemDir; if not ExtrZip(sSysDir, true) then exit; DeleteFile(sResPath); AddInstEnt('Tocsg.Installation.Executable', 'Environment check'); if aInstForm <> nil then begin Guard(AgentModel, TAgentModel.Create); AgentModel.EmpNo := aInstForm.edEmpNo.Text; AgentModel.VpnInfo := aInstForm.edVpnId.Text; AgentModel.Save(sInstDir + 'conf\' + DAT_AGENT); end; AddInstEnt('Tocsg.Installation.ServiceManager', 'Windows Service Registration'); if FileExists(sInstDir + DLL_SV) then begin // ¼­ºñ½º DLL ±¸µ¿ // ¼­ºñ½º DLL·Î ±¸µ¿Çϸé ÇÁ·Î±×·¥ ÆÄÀÏÁî, ÇÁ·Î¼¼½º ¸ñ·Ï¿¡ Á¢±Ù ÇÏÁö ¸øÇÏ´Â Çö»óÀÌ ¹ß°ßµÆ´Ù... 22_0511 17:21:35 kku if not MoveFile(PChar(sInstDir + DLL_SV), PChar(sSysDir + DLL_SV)) then exit; Sleep(1000); AddInstEnt('Tocsg.Installation.Validator', 'Validating the installation'); if ServiceExists(NAME_SERVICE) or InstallServiceDll(sSysDir + DLL_SV, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START) then begin Sleep(500); if bStartSvc then begin Result := ServiceStart(NAME_SERVICE); SetVisibleServce(NAME_SERVICE, false); end else Result := true; end; end else begin if not MoveFile(PChar(sInstDir + EXE_SV), PChar(sSysDir + EXE_SV)) then exit; Sleep(1000); AddInstEnt('Tocsg.Installation.Validator', 'Validating the installation'); if InstallService(NAME_SERVICE, sSysDir + EXE_SV, NAME_SERVICE, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START) then begin Sleep(500); if bStartSvc then begin Result := ServiceStart(NAME_SERVICE); SetVisibleServce(NAME_SERVICE, false); end else Result := true; end; end; except on E: Exception do ETgException.TraceException(E, 'Fail .. ProcessInstall()'); end; end; { TDlgeCrmHeInstMain } Constructor TDlgeCrmHeInstMain.Create(aOwner: TComponent); procedure InitCtrls; var i: Integer; sInstDir: String; begin SetImgBtn(imgBtns, imgMin, 0); SetImgBtn(imgBtns, imgExit, 2); SetImgBtn(imgBtns2, imgPrev, 0); SetImgBtn(imgBtns2, imgNext, 2); SetImgCtrl(imgProgs, imgProg, 0); sInstDir := GetProgramFilesDir + DIR_HE; if DirectoryExists(sInstDir) and FileExists(sInstDir + EXE_HE) then begin SetImgCtrl(imgBtnInit, imgDelete, imgDelete.Tag); SetImgCtrl(imgBtnInit, imgReinstall, imgReinstall.Tag); imgNext.Visible := false; cpMain.ActiveCard := cdInstalled; end else cpMain.ActiveCard := cdWelcome; end; begin Inherited Create(aOwner); Caption := APP_NAME; InitCtrls; end; procedure TDlgeCrmHeInstMain.SetImgBtn(aImgList: TPngImageList; imgBtn: TImage; nImgIdx: Integer); begin aImgList.GetIcon(nImgIdx, imgBtn.Picture.Icon); imgBtn.Repaint end; procedure TDlgeCrmHeInstMain.SetImgCtrl(aImgList: TPngImageCollection; imgCtrl: TImage; nImgIdx: Integer); begin if (nImgIdx > -1) and (aImgList.Items.Count > nImgIdx) then imgCtrl.Picture.Assign(aImgList.Items[nImgIdx].PngImage); end; procedure TDlgeCrmHeInstMain.tExitTimer(Sender: TObject); begin Dec(_nExitSec); if _nExitSec <= 0 then begin tExit.Enabled := false; Close; exit; end; lbExitMsg.Caption := Format('¼³Ä¡ ¸¶¹ý»ç´Â %d ÃÊ ÈÄ Á¾·áµË´Ï´Ù.', [_nExitSec]); Application.ProcessMessages; end; procedure TDlgeCrmHeInstMain.vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var pData: PInstEnt; begin pData := Sender.GetNodeData(Node); Finalize(pData^); end; procedure TDlgeCrmHeInstMain.vtListGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: string); begin HintText := vtList.Text[Node, Column]; end; procedure TDlgeCrmHeInstMain.vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TInstEnt); end; procedure TDlgeCrmHeInstMain.vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PInstEnt; begin pData := Sender.GetNodeData(Node); case Column of 0 : CellText := IntToStr(Node.Index + 1); 1 : CellText := pData.sName; 2 : CellText := pData.sDesc; end; end; procedure TDlgeCrmHeInstMain.edVpnIdKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key := #0; imgNextClick(nil); exit; end; end; procedure TDlgeCrmHeInstMain.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0); end; procedure TDlgeCrmHeInstMain.imgDeleteClick(Sender: TObject); begin if MessageBox(Handle, PChar('»èÁ¦ÇϽðڽÀ´Ï±î?'), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit; if UninstallCrmHE then begin imgNext.Tag := 4; imgNext.Visible := true; SetImgBtn(imgBtns2, imgNext, imgNext.Tag); SetImgCtrl(imgProgs, imgProg, 4); tExit.Enabled := true; imgInstalled.Visible := false; lbCompleted.Caption := '»èÁ¦ ¿Ï·á'; lbCompletedMsg.Caption := 'QS-eCRM Home Edition »èÁ¦°¡ ¿Ï·áµÇ¾ú½À´Ï´Ù.'; cpMain.ActiveCard := cdCompleted; Application.ProcessMessages; end else begin MessageBox(Handle, PChar('»èÁ¦¸¦ ¿Ï·áÇÏÁö ¸øÇß½À´Ï´Ù.'+#13+#10+'Àá½ÃÈÄ ´Ù½Ã ½ÃµµÇØ ÁֽʽÿÀ.'), PChar(Caption), MB_ICONWARNING or MB_OK); end; end; procedure TDlgeCrmHeInstMain.imgDeleteMouseEnter(Sender: TObject); begin if Sender is TImage then SetImgCtrl(imgBtnInit, TImage(Sender), TImage(Sender).Tag + 1); end; procedure TDlgeCrmHeInstMain.imgDeleteMouseLeave(Sender: TObject); begin if Sender is TImage then SetImgCtrl(imgBtnInit, TImage(Sender), TImage(Sender).Tag); end; procedure TDlgeCrmHeInstMain.imgExitClick(Sender: TObject); begin if not tExit.Enabled then begin if MessageBox(Handle, PChar('¼³Ä¡¸¦ Á¾·áÇϽðڽÀ´Ï±î?'), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit; end; Close; end; procedure TDlgeCrmHeInstMain.imgMinClick(Sender: TObject); begin WindowState := TWindowState.wsMinimized; end; procedure TDlgeCrmHeInstMain.imgMinMouseEnter(Sender: TObject); begin if Sender is TImage then SetImgBtn(imgBtns, TImage(Sender), TImage(Sender).Tag + 1); end; procedure TDlgeCrmHeInstMain.imgMinMouseLeave(Sender: TObject); begin if Sender is TImage then SetImgBtn(imgBtns, TImage(Sender), TImage(Sender).Tag); end; procedure TDlgeCrmHeInstMain.imgNextClick(Sender: TObject); begin if imgNext.Tag = 4 then begin Close; exit; end; case cpMain.ActiveCardIndex of 0 : begin imgPrev.Visible := true; cpMain.ActiveCard := cdLicense; imgNext.Enabled := rdAgree.Checked; if imgNext.Enabled then SetImgBtn(imgBtns2, imgNext, imgNext.Tag) else SetImgBtn(imgBtns2, imgNext, imgNext.Tag + 1); SetImgCtrl(imgProgs, imgProg, 1); end; 1 : begin cpMain.ActiveCard := cdInfo; SetImgCtrl(imgProgs, imgProg, 2); end; 2 : begin edEmpNo.Text := Trim(edEmpNo.Text); edVpnId.Text := Trim(edVpnId.Text); if edEmpNo.Text = '' then begin MessageBox(Handle, PChar('"»ç¹ø"À» ÀÔ·ÂÇØ ÁֽʽÿÀ.'), PChar(Caption), MB_ICONWARNING or MB_OK); edEmpNo.SetFocus; exit; end; if edVpnId.Text = '' then begin MessageBox(Handle, PChar('"VPN °èÁ¤"À» ÀÔ·ÂÇØ ÁֽʽÿÀ.'), PChar(Caption), MB_ICONWARNING or MB_OK); edVpnId.SetFocus; exit; end; cpMain.ActiveCard := cdInstall; SetImgCtrl(imgProgs, imgProg, 3); imgPrev.Enabled := false; SetImgBtn(imgBtns2, imgPrev, imgPrev.Tag + 1); imgNext.Enabled := false; SetImgBtn(imgBtns2, imgNext, imgNext.Tag + 1); if ProcessInstall(Self, false) then begin imgNext.Enabled := true; SetImgBtn(imgBtns2, imgNext, imgNext.Tag); end else MessageBox(Handle, PChar('¼³Ä¡Áß ¿À·ù°¡ ¹ß»ýÇß½À´Ï´Ù.'), PChar(Caption), MB_ICONSTOP or MB_OK); end; 3 : begin cpMain.ActiveCard := cdCompleted; imgPrev.Visible := false; imgNext.Tag := 4; SetImgBtn(imgBtns2, imgNext, imgNext.Tag); SetImgCtrl(imgProgs, imgProg, 4); tExit.Enabled := true; // ³ªÁß¿¡ ½ÃÀÛÇϵµ·Ï º¸¿Ï 22_0510 15:13:29 kku // ¿Ï·á ÆäÀÌÁö¿¡¼­ ÀÚµ¿ ´Ý±â Ä«¿îµÉ¶§ ÇÁ·Î±×·¥ÀÌ ÆË¾÷ µÇ¾ß ´õ ÁÁÀ»µí ÇÔ ServiceStart(NAME_SERVICE); SetVisibleServce(NAME_SERVICE, false); end; end; end; procedure TDlgeCrmHeInstMain.imgPrevClick(Sender: TObject); begin case cpMain.ActiveCardIndex of 1 : begin imgPrev.Visible := false; cpMain.ActiveCard := cdWelcome; imgNext.Enabled := true; SetImgBtn(imgBtns2, imgNext, imgNext.Tag); SetImgCtrl(imgProgs, imgProg, 0); end; 2 : begin cpMain.ActiveCard := cdLicense; SetImgCtrl(imgProgs, imgProg, 1); end; end; end; procedure TDlgeCrmHeInstMain.imgPrevMouseEnter(Sender: TObject); begin if (Sender is TImage) and TImage(Sender).Enabled then SetImgBtn(imgBtns2, TImage(Sender), TImage(Sender).Tag + 1); end; procedure TDlgeCrmHeInstMain.imgPrevMouseLeave(Sender: TObject); begin if (Sender is TImage) and TImage(Sender).Enabled then SetImgBtn(imgBtns2, TImage(Sender), TImage(Sender).Tag); end; procedure TDlgeCrmHeInstMain.imgReinstallClick(Sender: TObject); begin imgNext.Visible := true; cpMain.ActiveCard := cdWelcome; end; procedure TDlgeCrmHeInstMain.process_WM_SYSCOMMAND(var msg: TWMSysCommand); begin if msg.CmdType = SC_CLOSE then begin imgExitClick(nil); exit; end; Inherited; end; procedure TDlgeCrmHeInstMain.rdAgreeClick(Sender: TObject); begin if rdAgree.Checked then begin SetImgBtn(imgBtns2, imgNext, imgNext.Tag); imgNext.Enabled := true; end; end; procedure TDlgeCrmHeInstMain.rdNoAgreeClick(Sender: TObject); begin if rdNoAgree.Checked then begin SetImgBtn(imgBtns2, imgNext, imgNext.Tag + 1); imgNext.Enabled := false; end; end; end.