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, Vcl.Buttons, IdHTTP, IdSSLOpenSSL, IdIOHandler, System.Actions, Vcl.ActnList, AbArcTyp, AbUtils, Tocsg.Obj, superobject; //{$DEFINE _MOTRAS_} //{$DEFINE _SILENT_} const IGNORE_INTERGRITY_FILES = 'ptnsch.dat|eCrmHeServiced.dll|bootone.dll'; type PInstEnt = ^TInstEnt; TInstEnt = record sName, sDesc: String; end; TDlgeCrmHeInstMain = class(TForm) seMain: TShape; Label1: TLabel; imgLogo: TImage; imgProg: TImage; imgMain: TImage; imgMin: TImage; imgExit: TImage; imgNext: TImage; imgPrev: TImage; imgBtns: TPngImageList; imgProgs: TPngImageCollection; imgBtns2: TPngImageList; cpMain: TCardPanel; cdWelcome: TCard; Label2: TLabel; lbWC_Msg1: TLabel; lbWC_Msg2: 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; tSilent: TTimer; cdUserInfoAgree: TCard; Label13: TLabel; Label14: TLabel; mmUserInfoAgree: TMemo; rdAgree2: TRadioButton; rdNoAgree2: TRadioButton; btnInfo: TSpeedButton; chCheckEmpNo: TCheckBox; imgTops: TPngImageCollection; pnProg: TPanel; Label3: TLabel; Label4: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; lbDelete: TLabel; lbReinstall: TLabel; mmLicense_en: TMemo; ActionList: TActionList; acAgree: TAction; acNoAgree: TAction; acNext: TAction; acPrev: TAction; acComplete: TAction; acReinstall: TAction; 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); procedure tSilentTimer(Sender: TObject); procedure edEmpNoKeyPress(Sender: TObject; var Key: Char); procedure btnInfoClick(Sender: TObject); procedure lbDeleteMouseEnter(Sender: TObject); procedure lbDeleteMouseLeave(Sender: TObject); procedure lbReinstallMouseEnter(Sender: TObject); procedure lbReinstallMouseLeave(Sender: TObject); procedure acAgreeExecute(Sender: TObject); procedure acNoAgreeExecute(Sender: TObject); procedure acReinstallExecute(Sender: TObject); procedure acCompleteExecute(Sender: TObject); procedure acNextExecute(Sender: TObject); procedure acPrevExecute(Sender: TObject); private { Private declarations } HTTP_: TIdHTTP; SSL_: TIdSSLIOHandlerSocketOpenSSL; sEmpNoVerifyOK_: String; procedure InitHttp; function CheckEmpNo: Boolean; function LoadEmpNo: Boolean; procedure SetImgBtn(aImgList: TPngImageList; imgBtn: TImage; nImgIdx: Integer); procedure SetImgCtrl(aImgList: TPngImageCollection; imgCtrl: TImage; nImgIdx: Integer); procedure SetLangRes; function GetLangRes(sOrg, sRes: String): String; procedure SetBoldEntProg(n: Integer); function ProcessCheckId_CJONS: Boolean; public { Public declarations } Constructor Create(aOwner: TComponent); override; Destructor Destroy; override; procedure process_WM_SYSCOMMAND(var msg: TWMSysCommand); Message WM_SYSCOMMAND; end; TInstFileInfo = class(TTgObject) private IgrFList_, FileList_: TStringList; procedure OnZipConfirmItem(Sender : TObject; Item : TAbArchiveItem; ProcessType : TAbProcessType; var Confirm : Boolean); public CurrDir: String; Constructor Create; Destructor Destroy; override; procedure SaveFileInfo(sPath: String); end; function ProcessInstall(aInstForm: TDlgeCrmHeInstMain; bStartSvc: Boolean = false): Boolean; var DlgeCrmHeInstMain: TDlgeCrmHeInstMain; implementation uses Tocsg.Registry, Define, Tocsg.Path, ProcessUninstall, GlobalDefine, Tocsg.VTUtil, Tocsg.Safe, Tocsg.Exception, Tocsg.Service, Winapi.WinSvc, Tocsg.Process, Tocsg.Shell, Tocsg.Files, Tocsg.Strings, CrmLogger, Tocsg.Trace, Tocsg.WTS, Tocsg.Win32, Condition, Tocsg.WinInfo, CrmUtil, AbUnzper, GlobalOutAddInDefine, DUserInfoAgree, ManagerModel, Tocsg.Convert, Lang, Tocsg.Hash; {$R *.dfm} resourcestring RS_FMT_EmpNoInfo = '사번 : %s'#13#10'이름 : %s'#13#10'부서 : %s'#13#10'상태 : %s'; RS_FMT_EmpNoInfo2 = 'ID : %s'#13#10'이름 : %s'#13#10'부서 : %s'#13#10'상태 : %s'; RS_GetEmpNoInfo = '사번 정보를 확인했습니다.'; RS_GetEmpNoInfo2 = 'ID 정보를 확인했습니다.'; RS_Deleted = '삭제됨'; RS_Normal = '정상'; RS_InvaludEmpNo = '유효하지 않은 사번입니다.'; RS_InvaludEmpNo2 = '유효하지 않은 ID 입니다.'; RS_InputEmpNo = '"사번"을 입력해주십시오.'; RS_InputEmpNo2 = 'ID를 입력해주십시오.'; RS_FMT_TERMINATE = '설치 마법사는 %d 초 후 종료됩니다.'; RS_Q_Delete = '삭제하시겠습니까?'; RS_DeleteComp = '삭제 완료'; RS_MsgDeleted = '삭제가 완료되었습니다.'; RS_MsgNoDelete = '삭제를 완료하지 못했습니다.'+#13+#10+'잠시후 다시 시도해 주십시오.'; RS_Q_Exit = '설치를 종료하시겠습니까?'; var _nExitSec: Integer = 5; { TInstFileInfo } Constructor TInstFileInfo.Create; begin Inherited Create; IgrFList_ := TStringList.Create; IgrFList_.CaseSensitive := false; SplitString(IGNORE_INTERGRITY_FILES, '|', IgrFList_); FileList_ := TStringList.Create; end; Destructor TInstFileInfo.Destroy; begin // FileList_.SaveToFile('c:\test.txt'); FreeAndNil(FileList_); FreeAndNil(IgrFList_); Inherited; end; procedure TInstFileInfo.OnZipConfirmItem(Sender : TObject; Item : TAbArchiveItem; ProcessType : TAbProcessType; var Confirm : Boolean); begin try Confirm := true; if (ProcessType = ptExtract) and not Item.IsDirectory and (IgrFList_.IndexOf(Item.FileName) = -1) then FileList_.Add(CurrDir + StringReplace(Item.FileName, '/', '\', [rfReplaceAll])); except on E: Exception do ETgException.TraceException(Self, E, 'Fail .. OnZipConfirmItem()'); end; end; procedure TInstFileInfo.SaveFileInfo(sPath: String); var OA, O: ISuperObject; i: Integer; sHash: String; begin try OA := TSuperObject.Create(stArray); for i := 0 to FileList_.Count - 1 do begin if FileExists(FileList_[i]) then begin sHash := GetFileToSha256(FileList_[i]); if sHash <> '' then begin O := SO; O.S['P'] := FileList_[i]; O.S['H'] := sHash; OA.AsArray.Add(O); end; end; end; O := SO; O.O['List'] := OA; SaveJsonObjToFile(O, sPath); except on E: Exception do ETgException.TraceException(Self, E, 'Fail .. SaveFileInfo()'); end; end; 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, sBackDir, sResPath: String; CompModel: TCompanyModel; AgentModel: TAgentModel; InstFileInfo: TInstFileInfo; function GetRes(sId: String; sBackName: 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); if sBackName <> '' then res.SaveToFile(sBackDir + sBackName); 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; bAddInfo: Boolean = false; bIgrErr: Boolean = false): Boolean; var zip: TAbUnZipper; begin Result := bIgrErr or false; if not ForceDirectories(sDestDir) then exit; try Guard(zip, TAbUnzipper.Create(nil)); zip.FileName := sResPath; zip.ExtractOptions := [eoCreateDirs, eoRestorePath]; zip.BaseDirectory := sDestDir; // zip.OnArchiveProgress := ; // zip.OnNeedPassword := ; if bAddInfo then begin InstFileInfo.CurrDir := IncludeTrailingPathDelimiter(sDestDir); zip.OnConfirmProcessItem := InstFileInfo.OnZipConfirmItem; end; zip.ExtractFiles('*.*'); Result := true; except on E: Exception do ETgException.TraceException(E, Format('Fail .. ExtrZip(), ExtrDir="%s"', [sDestDir])); end; // 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 + EXE_HE) then exit; // 1.2.x 이하 버전에서는 PROP_USERINFO 사번 정보 데이터가 없다. // 체크하지 않도록 수정 22_0711 15:39:07 kku // if not FileExists(sInstDir + DIR_CONF + DAT_AGENT) and // not FileExists(sInstDir + DIR_CONF + PROP_USERINFO) then // exit; end; try Guard(InstFileInfo, TInstFileInfo.Create); 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 := ExecuteApp(sCurPath, Format('-i "%s"', [sParam]), SW_HIDE) else DeleteFile(sCurPath); end; end; end; end; {$IFDEF _PATCH_} var nUpdate: Integer := 1; // 패치 시 화면잠금 상태 였는지 체크 추가 22_1018 13:55:28 kku if FindWindow('TDlgLockScreen', nil) <> 0 then nUpdate := 3; SetRegValueInteger(HKEY_LOCAL_MACHINE, 'SOFTWARE\eCrmHomeEdition', 'update', nUpdate, true); {$ELSE} SetRegValueInteger(HKEY_LOCAL_MACHINE, 'SOFTWARE\eCrmHomeEdition', 'update', 2, true); {$ENDIF} {$IFDEF _HDENG_} {$IF Defined(HEC_2) or Defined(HEC_3)} // 기존 개발계, 운영계 SetRegValueInteger(HKEY_LOCAL_MACHINE, 'SOFTWARE\eCrmHomeEdition', 'HEC_VER', 1, true); {$ELSE} // 고도화 SetRegValueInteger(HKEY_LOCAL_MACHINE, 'SOFTWARE\eCrmHomeEdition', 'HEC_VER', 2, true); {$IFEND} {$ENDIF} AddInstEnt('Tocsg.Installation.Initiator', 'Initiate application check'); UninstallCrmHE(ProcInfo.dwProcessId, true); // aInstForm = nil {true = 패치}); sInstDir := GetProgramFilesDir + DIR_HE; sBackDir := sInstDir + 'Resource\'; if not ForceDirectories(sInstDir) or not ForceDirectories(sBackDir) then exit; DeleteFile(sBackDir + 'rst.01'); // DeleteFile(sBackDir + 'rst.02'); // KV, 변동 없는 모듈의 경우 지우지 않음 23_1204 12:40:59 kku DeleteFile(sBackDir + 'rst.03'); DeleteFile(sBackDir + 'rst.04'); DeleteFile(sBackDir + 'rst.05'); // DeleteFile(sBackDir + 'rst.06'); // Spool - Bs1psf.dat // 변동 없는 모듈의 경우 지우지 않음 23_1204 12:40:59 kku // 업체 정보 암호화해서 저장 // 업체 정보 저장 버전이 전체적으로 모두 퍼진다면 이 코드는 _INST_ 에서만 사용하면 된다. // 최종 목표는 패치 파일 하나만 빌드, 관리되는것 22_0624 08:23:35 kku Guard(CompModel, TCompanyModel.Create); CompModel.CustomerType := CUSTOMER_TYPE; CompModel.CustomerSubType := CUSTOMER_SUB_TYPE; CompModel.SvrDestList.Clear; GetDestServerList(CompModel.SvrDestList); CompModel.Save(sInstDir + DIR_CONF + DAT_COMPANY); sResPath := sInstDir + '$InstData'; AddInstEnt('Tocsg.Installation.Service', 'Service check'); // if not DirectoryExists(sInstDir + 'bin\') and if GetRes('RS_KVBIN', 'rst.02') then begin // 이건 패치의 경우 없을 수 있다. 22_0517 16:39:29 kku ExtrZip(sInstDir + 'bin\', true); end; AddInstEnt('Tocsg.Installation.Component', 'Component check'); if not GetRes('RS_CONF', 'rst.03') then exit; if not ExtrZip(sInstDir + DIR_CONF, true) then exit; // Bs1shl.dll 탐색기 context popup menu 등록 23_0227 15:43:16 kku if FileExists(sInstDir + DIR_CONF + DLL_SHELL) then begin if ExistsKey(HKEY_CLASSES_ROOT, REG_BS1_SHELL) then begin // todo : Bs1shl.dll 버전 체크 및 업데이트 { if FileExists(sDir + DLL_SHELL) then begin // 이미 등록된 걸로 판단, DLL 버전 체크 FI := TKzFileInfo.Create(sDir + DLL_SHELL); try sOldVer := FI.Version; finally FI.Free; end; // 버전 업데이트 되었다면 해제 후 처리 19_0218 22:23:05 kku FI := TKzFileInfo.Create(sDir + sDllName); try if sOldVer <> FI.Version then begin ExecutePath_hide('regsvr32.exe', '/s /u "' + sDir + DLL_SHELL + '"'); Sleep(500); TerminateProcessByName('explorer.exe'); Sleep(500); ExecutePath('explorer.exe'); DeleteFile_wait(sDir + DLL_SHELL); end; finally FI.Free; end; end; } end else begin // ExecutePath_hide('regsvr32.exe', '/s /i "' + sInstDir + DIR_CONF + DLL_SHELL + '"'); end; end; // 아웃룩 플러그인 설치 // {$IFNDEF _KIMCHANG_} InstallOutlookAddin(sInstDir + DIR_CONF); // {$ENDIF} AddInstEnt('Tocsg.Installation.LicenseMgr', 'License check'); if not GetRes('RS_HEBIN', 'rst.01') then exit; if not ExtrZip(sInstDir, true) then exit; // 언어 추가 22_0810 16:48:03 kku if GetRes('RS_LANG', 'rst.04') then begin ExtrZip(sInstDir + 'Language\', true); end; if GetRes('RS_SLCORE', 'rst.05') then ExtrZip(sInstDir, true); if not FileExists(sInstDir + DIR_CONF + EXE_SPL) and GetRes('RS_EXTRSPOOL', 'rst.06') then CopyFile(PChar(sResPath), PChar(sInstDir + DIR_CONF + EXE_SPL), false); // 신한카드 safePC 삭제툴, 나중에 제거 해야함 23_0109 13:43:19 kku {$IFDEF _SHCD_} if GetRes('RS_SHCD_SAFEPC_DEL') then begin ExtrZip(sInstDir, false, true); end; {$ENDIF} {$IFDEF _LSITC_} if GetRes('RS_LSITC_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _DEV_} if GetRes('RS_DEV_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _DEMO_} if GetRes('RS_DEMO_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _HDENG_} if GetRes('RS_HEC_DATA') then begin ExtrZip(sInstDir + DIR_CONF); DeleteFile_wait(sInstDir + DIR_CONF + 'Bs1aip.dat'); MoveFile_wait(sInstDir + DIR_CONF + 'DRM_M.ico', sInstDir + DIR_CONF + 'Bs1aip.dat') end; {$ENDIF} {$IFDEF _GEC_} if GetRes('RS_GEC_DATA') then begin ExtrZip(sInstDir + DIR_CONF); DeleteFile_wait(sInstDir + DIR_CONF + 'Bs1aip.dat'); MoveFile_wait(sInstDir + DIR_CONF + 'DRM_M.ico', sInstDir + DIR_CONF + 'Bs1aip.dat') end; {$ENDIF} {$IFDEF _HCA_} if GetRes('RS_HCA_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _KDNVN_} if GetRes('RS_KDNVN_DATA') then begin ExtrZip(sInstDir + DIR_CONF); DeleteFile_wait(sInstDir + DIR_CONF + 'Bs1aip.dat'); MoveFile_wait(sInstDir + DIR_CONF + 'DRM_M.ico', sInstDir + DIR_CONF + 'Bs1aip.dat') end; {$ENDIF} {$IFDEF _UNITUS_} if GetRes('RS_UNITUS_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _MOTRAS_} if GetRes('RS_MOTRAS_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _SKEC_} if GetRes('RS_SKEC_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _WHANIN_} if GetRes('RS_WHANIN_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _BLUECORNER_} if GetRes('RS_WELCAPI_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} // {$IFDEF _JUVIS_} // if GetRes('RS_JUVIS_DATA') then // begin // ExtrZip(sInstDir + DIR_CONF); // end; // {$ENDIF} {$IFDEF _SERVE1_} if GetRes('RS_SERVE1_DATA') then begin ExtrZip(sInstDir + DIR_CONF); {$IFDEF _PATCH_} var sUnInst: String := GetProgramFilesDir + DIR_HE + DIR_CONF + 'InstallCleaner.exe'; if FileExists(sUnInst) then DeleteFile(sUnInst); {$ENDIF} end; {$ENDIF} {$IFDEF _KBIZ_} if GetRes('RS_KBIZ_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _KORENTAL_} if GetRes('RS_KORENTAL_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _SHCI_} if GetRes('RS_SHCI_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _SHSC_} if GetRes('RS_SHSC_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _WINSTN_} if GetRes('RS_WINSTN_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _SANKYO_} if GetRes('RS_SANKYO_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _LOTTEMART_} if GetRes('RS_LOTTEMART_FSD') then begin ExtrZip(sInstDir); end; {$ENDIF} {$IFDEF _CJONS_} if GetRes('RS_CJOVN_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _WELFNI_} if GetRes('RS_WFNI_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _WELFND_} if GetRes('RS_WFND_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _GIORDANO_} if GetRes('RS_GIORDANO_DATA') then begin ExtrZip(sInstDir + DIR_CONF); end; {$ENDIF} {$IFDEF _SANKYO_} // 다이이찌산쿄 아웃룩 플러그인 체크값 초기화, 160버전까지 유지필요 24_0325 10:45:49 kku if GetRegValueAsInteger(HKEY_LOCAL_MACHINE, REG_HE, 'DSK_OI') <> 1 then begin DelRegKey(HKEY_CLASSES_ROOT, REG_BS1OutlookAddInKey); SetRegValueInteger(HKEY_LOCAL_MACHINE, REG_HE, 'DSK_OI', 1, true); end; {$ENDIF} {$IFDEF _KIMCHANG_} if GetRes('RS_XPRINT_DATA') then begin sSysDir := sInstDir[1] + ':\ProgramData\' + DIR_XPRINT; ExtrZip(sSysDir); case GetServiceStatus('BSonePrintService') of SERVICE_RUNNING, SERVICE_START_PENDING : ; else begin ExecutePath_hide(sSysDir + EXE_xPrintSvc, '-install'); end; end; end; {$ENDIF} // MG.exe에서 사용할거 같은? DLL 배포 if not GetRes('RS_DLLS') then exit; sSysDir := GetSystemDir; if not ExtrZip(sSysDir, false, true) then exit; DeleteFile(sResPath); AddInstEnt('Tocsg.Installation.Executable', 'Environment check'); if aInstForm <> nil then begin Guard(AgentModel, TAgentModel.Create); AgentModel.Load(sInstDir + DIR_CONF + DAT_AGENT); // 기존 정보도 남겨두기 위해 22_0610 13:43:31 kku AgentModel.EmpNo := aInstForm.edEmpNo.Text; // AgentModel.VpnInfo := aInstForm.edEmpNo.Text; // aInstForm.edVpnId.Text; AgentModel.HostName := GetComName; AgentModel.DomainName := AgentModel.HostName + '\' + GetAccount; AgentModel.Account := WTS_GetCurrentUserName; if AgentModel.Account = '' then AgentModel.Account := GetAccount; AgentModel.UserName := ExtractFilePath(AgentModel.DomainName) + AgentModel.Account; AgentModel.Save(sInstDir + DIR_CONF + DAT_AGENT); end; InstFileInfo.SaveFileInfo(sBackDir + 'rst.00'); AddInstEnt('Tocsg.Installation.ServiceManager', 'Windows Service Registration'); // 레지스트리로 대체 22_0621 08:25:19 kku // if aInstForm = nil then // begin // // HE.exe 실행 시 패치됐다는걸 알기 위해 만들어줌 22_0531 14:10:31 kku // WriteLnFileEndUTF8(sInstDir + LOG_PATCH, DateTimeToStr(Now)); // end; 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); // 서비스를 숨기면 윈도우 메이저 업데이트 시 서비스가 사라지는 문제가 있음 24_0105 08:18:24 kku // SetVisibleService(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); // 서비스를 숨기면 윈도우 메이저 업데이트 시 서비스가 사라지는 문제가 있음 24_0105 08:18:24 kku // SetVisibleService(NAME_SERVICE, false); end else Result := true; end; end; {$IFDEF _SILENT_} {$IFDEF _SHCD_} var sPath: String := GetWindowsDir; if Length(sPath) > 0 then begin sPath := sPath[1] + Format(':\Users\%s\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\eCrmHeSilentInstaller.lnk', [GetUserNameFromReg]); if FileExists(sPath) then DeleteFile(PChar(sPath)); sPath := sPath[1] + ':\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\eCrmHeSilentInstaller.lnk'; if FileExists(sPath) then DeleteFile(PChar(sPath)); end; {$ENDIF} {$ENDIF} CopyRegKey(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services\SvcCrmHe', 'SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal\SvcCrmHe'); CopyRegKey(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services\SvcCrmHe', 'SYSTEM\CurrentControlSet\Control\SafeBoot\Network\SvcCrmHe'); // {$IFDEF _CJONS_} // {$IFDEF _DEMO_} //// // 현재 사용자 권한으로 실행 24_1212 13:40:32 kku // SetRegValueString(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services\SvcCrmHe', 'EA', 'Admin', true); //// SetRegValueString(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services\SvcCrmHe', 'EA', 'User', true); // {$ENDIF} except on E: Exception do ETgException.TraceException(E, 'Fail .. ProcessInstall()'); end; end; { TDlgeCrmHeInstMain } Constructor TDlgeCrmHeInstMain.Create(aOwner: TComponent); function IsUninstall: Boolean; begin // 기본으로 삭제버튼 숨기도록 기능 수정 24_0206 10:49:11 kku Result := false; {$IFDEF _METLIFE_} Result := true; {$ENDIF} // 메트라이프 {$IFDEF _SANKYO_} Result := true; {$ENDIF} // 한국다이이찌산쿄 {$IFDEF _CNSCERT_} Result := true; {$ENDIF} // LGCNS(인증) {$IFDEF _CNSMYDATA_} Result := true; {$ENDIF} // LGCNS(mydata) {$IFDEF _KOCES_} Result := true; {$ENDIF} // 한국신용카드결제 {$IFDEF _AUTOLEASE_} Result := true; {$ENDIF} // 롯데오토리스 {$IFDEF _HDQUMING_} Result := true; {$ENDIF} // 현대렌탈케어 {$IFDEF _HANYANG_} Result := true; {$ENDIF} // 한양증권 {$IFDEF _NHL_} Result := true; {$ENDIF} // NH농손해보험 {$IFDEF _KFB_} Result := true; {$ENDIF} // 은행연합회 {$IFDEF _JB_MAINTAIN_} Result := true; {$ENDIF} // JB우리캐피탈 {$IFDEF _JB_DEV_} Result := true; {$ENDIF} // JB우리캐피탈 {$IFDEF _UBASE_} Result := true; {$ENDIF} // 이베이코리아(G마켓) {$IFDEF _SKMWS_} Result := true; {$ENDIF} // SK마이크로웍스 end; procedure InitCtrls; var 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; if IsBS1Display then begin Caption := APP_NAME_BS1; lbWC_Msg1.Caption := StringReplace(lbWC_Msg1.Caption, APP_NAME_CRM, APP_NAME_BS1, [rfReplaceAll]); lbWC_Msg2.Caption := StringReplace(lbWC_Msg2.Caption, APP_NAME_CRM, APP_NAME_BS1, [rfReplaceAll]); lbCompletedMsg.Caption := StringReplace(lbCompletedMsg.Caption, APP_NAME_CRM, APP_NAME_BS1, [rfReplaceAll]); end else begin Caption := APP_NAME_CRM; imgLogo.Picture.Assign(imgTops.Items[0].PngImage); end; if not IsUninstall then begin Label16.Visible := false; imgReinstall.Top := imgDelete.Top; lbReinstall.Top := lbDelete.Top; imgDelete.Enabled := false; imgDelete.Visible := false; lbDelete.Enabled := false; lbDelete.Visible := false; end; end; begin Inherited Create(aOwner); HTTP_ := nil; SSL_ := nil; sEmpNoVerifyOK_ := ''; SetLangRes; InitCtrls; {$IFDEF _PATCH_} chCheckEmpNo.Checked := false; {$ENDIF} if IsCJ_Affiliates then begin // {$IFDEF _CJONS_} Label9.Caption := 'ID'; chCheckEmpNo.Caption := 'Check ID'; chCheckEmpNo.Checked := true; chCheckEmpNo.Enabled := FileExists('C:\Program Files\Tocsg\$ForceHE.ini'); btnInfo.Visible := false; // {$ENDIF} end; {$IFDEF _KORENTAL_} Label9.Caption := '아이디'; chCheckEmpNo.Caption := '아이디 유효성 체크'; {$ENDIF} {$IFDEF _SILENT_} chCheckEmpNo.Checked := false; tSilent.Enabled := true; {$ENDIF} {$IFDEF _SOLIDEO_} chCheckEmpNo.Checked := true; chCheckEmpNo.Enabled := FileExists('C:\Program Files\Tocsg\$ForceHE.ini'); {$ENDIF} {$IF Defined(_KFTC_) or Defined(_ABL_) or Defined(_CGBEST_)} chCheckEmpNo.Checked := false; chCheckEmpNo.Enabled := false; chCheckEmpNo.Visible := false; btnInfo.Enabled := false; btnInfo.Visible := false; {$IFEND} {$IFDEF _KFTC_} chCheckEmpNo.Checked := true; chCheckEmpNo.Visible := FileExists('C:\Program Files\Tocsg\$ForceHE.ini'); chCheckEmpNo.Enabled := chCheckEmpNo.Visible; {$ENDIF} {$IF Defined(_DEV_) or Defined(_DEMO_) or Defined(_LOCAL_)} chCheckEmpNo.Checked := false; {$IFEND} //{$IFEND} end; Destructor TDlgeCrmHeInstMain.Destroy; begin if HTTP_ <> nil then FreeAndNil(HTTP_); if SSL_ <> nil then FreeAndNil(SSL_); Inherited; end; procedure TDlgeCrmHeInstMain.SetLangRes; procedure SetRes(aCtrl: TLabel; sVal: String); overload; inline begin if sVal <> '' then aCtrl.Caption := sVal; end; procedure SetRes(aCtrl: TRadioButton; sVal: String); overload;inline begin if sVal <> '' then aCtrl.Caption := sVal; end; procedure SetRes(aCtrl: TSpeedButton; sVal: String); overload;inline begin if sVal <> '' then aCtrl.Caption := sVal; end; procedure SetRes(aCtrl: TCheckBox; sVal: String); overload;inline begin if sVal <> '' then aCtrl.Caption := sVal; end; begin pnProg.Visible := LangKind <> lkKor; if pnProg.Visible then begin mmLicense.Visible := false; mmLicense_en.Visible := true; Label16.Visible := false; end; SetRes(Label2, RS_cpMain_cdWelcome_Label2); SetRes(lbWC_Msg1, RS_cpMain_cdWelcome_lbWC_Msg1); SetRes(lbWC_Msg2, RS_cpMain_cdWelcome_lbWC_Msg2); SetRes(Label13, RS_cpMain_cdUserInfoAgree_Label13); SetRes(Label14, RS_cpMain_cdUserInfoAgree_Label14); SetRes(rdAgree2, RS_cpMain_cdUserInfoAgree_rdAgree2); SetRes(rdNoAgree2, RS_cpMain_cdUserInfoAgree_rdNoAgree2); SetRes(Label5, RS_cpMain_cdLicense_Label5); SetRes(Label6, RS_cpMain_cdLicense_Label6); SetRes(rdAgree, RS_cpMain_cdLicense_rdAgree); SetRes(rdNoAgree, RS_cpMain_cdLicense_rdNoAgree); SetRes(Label15, RS_cpMain_cdInstalled_Label15); SetRes(Label16, RS_cpMain_cdInstalled_Label16); SetRes(lbDelete, RS_cpMain_cdInstalled_lbDelete); SetRes(lbReinstall, RS_cpMain_cdInstalled_lbReinstall); SetRes(Label11, RS_cpMain_cdInstall_Label11); SetRes(Label12, RS_cpMain_cdInstall_Label12); SetRes(btnInfo, RS_cpMain_cdInfo_btnInfo); SetRes(chCheckEmpNo, RS_cpMain_cdInfo_chCheckEmpNo); SetRes(Label7, RS_cpMain_cdInfo_Label7); SetRes(Label8, RS_cpMain_cdInfo_Label8); SetRes(Label9, RS_cpMain_cdInfo_Label9); SetRes(lbCompleted, RS_cpMain_cdCompleted_lbCompleted); SetRes(lbCompletedMsg, RS_cpMain_cdCompleted_lbCompletedMsg); SetRes(lbExitMsg, RS_cpMain_cdCompleted_lbExitMsg); end; function TDlgeCrmHeInstMain.GetLangRes(sOrg, sRes: String): String; begin if sRes <> '' then Result := sRes else Result := sOrg; end; procedure TDlgeCrmHeInstMain.SetBoldEntProg(n: Integer); begin Label3.Font.Style := Label3.Font.Style - [fsBold]; Label4.Font.Style := Label4.Font.Style - [fsBold]; Label17.Font.Style := Label17.Font.Style - [fsBold]; Label18.Font.Style := Label18.Font.Style - [fsBold]; Label19.Font.Style := Label19.Font.Style - [fsBold]; case n of 0 : Label3.Font.Style := Label3.Font.Style + [fsBold]; 1 : Label4.Font.Style := Label4.Font.Style + [fsBold]; 2 : Label17.Font.Style := Label17.Font.Style + [fsBold]; 3 : Label18.Font.Style := Label18.Font.Style + [fsBold]; 4 : Label19.Font.Style := Label19.Font.Style + [fsBold]; end; Application.ProcessMessages; end; procedure TDlgeCrmHeInstMain.InitHttp; function ExtractSSL_DLL: Boolean; var res: TResourceStream; ms: TMemoryStream; sSysDir: String; zip: TAbUnZipper; begin Result := false; try sSysDir := GetSystemDir; if FileExists(sSysDir + 'ssleay32.dll') and FileExists(sSysDir + 'libeay32.dll') then begin Result := true; exit; end; Guard(ms, TMemoryStream.Create); res := TResourceStream.Create(HInstance, 'RS_HEBIN', 'raw'); if res <> nil then begin res.SaveToStream(ms); res.Free; ms.Position := 0; Guard(zip, TAbUnzipper.Create(nil)); zip.Stream := ms; zip.ExtractOptions := [eoCreateDirs, eoRestorePath]; zip.BaseDirectory := sSysDir; zip.ExtractFiles('ssleay32.dll'); zip.ExtractFiles('libeay32.dll'); Result := FileExists(sSysDir + 'ssleay32.dll') and FileExists(sSysDir + 'libeay32.dll'); end; except // .. end; end; begin if not ExtractSSL_DLL then exit; if (HTTP_ = nil) and (SSL_ = nil) then begin SSL_ := TIdSSLIOHandlerSocketOpenSSL.Create(nil); SSL_.SSLOptions.Method := sslvSSLv23; SSL_.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_1, sslvTLSv1]; HTTP_ := TIdHTTP.Create(nil); HTTP_.IOHandler := SSL_; with HTTP_ do begin Request.Clear; Request.UserAgent := 'Mozilla/5.0'; Request.ContentType := 'application/json; charset=utf-8'; //'application/xml'; Request.Accept := 'application/json; charset=utf-8'; Request.Charset := 'utf-8'; Request.Connection := 'Keep-Alive'; Request.CacheControl := 'no-store'; ConnectTimeout := 2000; ReadTimeout := 2000; end; end; end; procedure TDlgeCrmHeInstMain.lbDeleteMouseEnter(Sender: TObject); begin imgDeleteMouseEnter(imgDelete); end; procedure TDlgeCrmHeInstMain.lbDeleteMouseLeave(Sender: TObject); begin imgDeleteMouseLeave(imgDelete); end; procedure TDlgeCrmHeInstMain.lbReinstallMouseEnter(Sender: TObject); begin imgDeleteMouseEnter(imgReinstall); end; procedure TDlgeCrmHeInstMain.lbReinstallMouseLeave(Sender: TObject); begin imgDeleteMouseLeave(imgReinstall); end; function TDlgeCrmHeInstMain.ProcessCheckId_CJONS: Boolean; var sInfo: String; O: ISuperObject; SvrList: TStringList; i: Integer; begin Result := false; edEmpNo.Text := Trim(edEmpNo.Text); if edEmpNo.Text = '' then begin MessageBox(Handle, PChar(GetLangRes(RS_InputEmpNo2, RS_S_InputEmpNo2)), PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; InitHttp; Guard(SvrList, TStringList.Create); GetDestServerList(SvrList); ASSERT(SvrList.Count > 0); for i := 0 to SvrList.Count - 1 do begin sInfo := GetEmpNoInfo(SvrList[i], HTTP_, edEmpNo.Text); if sInfo <> '' then begin try O := SO(sInfo); break; except // .. end; end; end; if (O <> nil) and (O.S['result'] <> 'false') then begin sEmpNoVerifyOK_ := edEmpNo.Text; sInfo := Format(GetLangRes(RS_FMT_EmpNoInfo2, RS_S_FMT_EmpNoInfo2), [O.S['empno'], O.S['name'], O.S['dept'], BooleanToStr(O.S['deleteyn'] = 'true', GetLangRes(RS_Deleted, RS_S_Deleted), GetLangRes(RS_Normal, RS_S_Normal))]); if MessageBox(Handle, PChar(GetLangRes(RS_GetEmpNoInfo2, RS_S_GetEmpNoInfo2) + #13#10#13#10 + sInfo), PChar(Caption), MB_ICONINFORMATION or MB_YESNO) <> IDNO then Result := true; end else begin sEmpNoVerifyOK_ := ''; MessageBox(Handle, PChar(GetLangRes(RS_InvaludEmpNo2, RS_S_InvaludEmpNo2)), PChar(Caption), MB_ICONWARNING or MB_OK); end; end; procedure TDlgeCrmHeInstMain.acAgreeExecute(Sender: TObject); begin rdAgree.Checked := true; end; procedure TDlgeCrmHeInstMain.acCompleteExecute(Sender: TObject); begin if (cpMain.ActiveCard = cdCompleted) and imgNext.Visible and imgNext.Enabled then imgNextClick(nil); end; procedure TDlgeCrmHeInstMain.acNextExecute(Sender: TObject); begin if imgNext.Visible and imgNext.Enabled then begin case cpMain.ActiveCardIndex of 0, 1, 2, 3, 6 : imgNextClick(nil); end; end; end; procedure TDlgeCrmHeInstMain.acNoAgreeExecute(Sender: TObject); begin rdNoAgree.Checked := true; end; procedure TDlgeCrmHeInstMain.acPrevExecute(Sender: TObject); begin if imgPrev.Visible and imgPrev.Enabled then begin case cpMain.ActiveCardIndex of 1, 2, 6 : imgPrevClick(nil); end; end; end; procedure TDlgeCrmHeInstMain.acReinstallExecute(Sender: TObject); begin if (cpMain.ActiveCard = cdInstalled) and imgReinstall.Visible and imgReinstall.Enabled then imgReinstallClick(nil); end; procedure TDlgeCrmHeInstMain.btnInfoClick(Sender: TObject); var sInfo: String; O: ISuperObject; SvrList: TStringList; i: Integer; begin edEmpNo.Text := Trim(edEmpNo.Text); if edEmpNo.Text = '' then begin if IsCJ_Affiliates then MessageBox(Handle, PChar(GetLangRes(RS_InputEmpNo2, RS_S_InputEmpNo2)), PChar(Caption), MB_ICONWARNING or MB_OK) else MessageBox(Handle, PChar(GetLangRes(RS_InputEmpNo, RS_S_InputEmpNo)), PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; InitHttp; Guard(SvrList, TStringList.Create); GetDestServerList(SvrList); ASSERT(SvrList.Count > 0); for i := 0 to SvrList.Count - 1 do begin sInfo := GetEmpNoInfo(SvrList[i], HTTP_, edEmpNo.Text); if sInfo <> '' then begin try O := SO(sInfo); break; except // .. end; end; end; if (O <> nil) and (O.S['result'] <> 'false') then begin sEmpNoVerifyOK_ := edEmpNo.Text; if IsCJ_Affiliates then begin sInfo := Format(GetLangRes(RS_FMT_EmpNoInfo2, RS_S_FMT_EmpNoInfo2), [O.S['empno'], O.S['name'], O.S['dept'], BooleanToStr(O.S['deleteyn'] = 'true', GetLangRes(RS_Deleted, RS_S_Deleted), GetLangRes(RS_Normal, RS_S_Normal))]); MessageBox(Handle, PChar(GetLangRes(RS_GetEmpNoInfo2, RS_S_GetEmpNoInfo2) + #13#10#13#10 + sInfo), PChar(Caption), MB_ICONINFORMATION or MB_OK); end else begin sInfo := Format(GetLangRes(RS_FMT_EmpNoInfo, RS_S_FMT_EmpNoInfo), [O.S['empno'], O.S['name'], O.S['dept'], BooleanToStr(O.S['deleteyn'] = 'true', GetLangRes(RS_Deleted, RS_S_Deleted), GetLangRes(RS_Normal, RS_S_Normal))]); MessageBox(Handle, PChar(GetLangRes(RS_GetEmpNoInfo, RS_S_GetEmpNoInfo) + #13#10#13#10 + sInfo), PChar(Caption), MB_ICONINFORMATION or MB_OK); end; end else begin sEmpNoVerifyOK_ := ''; if IsCJ_Affiliates then MessageBox(Handle, PChar(GetLangRes(RS_InvaludEmpNo2, RS_S_InvaludEmpNo2)), PChar(Caption), MB_ICONWARNING or MB_OK) else MessageBox(Handle, PChar(GetLangRes(RS_InvaludEmpNo, RS_S_InvaludEmpNo)), PChar(Caption), MB_ICONWARNING or MB_OK); end; end; function TDlgeCrmHeInstMain.CheckEmpNo: Boolean; var SvrList: TStringList; i: Integer; begin Result := false; edEmpNo.Text := Trim(edEmpNo.Text); if edEmpNo.Text = '' then begin if IsCJ_Affiliates then MessageBox(Handle, PChar(GetLangRes(RS_InputEmpNo2, RS_S_InputEmpNo2)), PChar(Caption), MB_ICONWARNING or MB_OK) else MessageBox(Handle, PChar(GetLangRes(RS_InputEmpNo, RS_S_InputEmpNo)), PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; InitHttp; Guard(SvrList, TStringList.Create); GetDestServerList(SvrList); ASSERT(SvrList.Count > 0); for i := 0 to SvrList.Count - 1 do begin if VerifyEmpNo(SvrList[i], HTTP_, edEmpNo.Text) then begin sEmpNoVerifyOK_ := edEmpNo.Text; Result := true; exit; end; end; 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(GetLangRes(RS_FMT_TERMINATE, RS_S_FMT_TERMINATE), [_nExitSec]); Application.ProcessMessages; end; procedure TDlgeCrmHeInstMain.tSilentTimer(Sender: TObject); begin tSilent.Enabled := false; //{$IF Defined(_KR_) or Defined(_LX_)} {$IFDEF _SILENT_} // 코리안리 재보험이 아닐 경우, 사번에 대한 정의를 따라 해줘야 한다. 22_0602 09:55:31 kku // if not LoadEmpNo then begin var sUserName: String := WTS_GetCurrentUserName; {$IFDEF _SHCD_} sUserName := 'Empty'; {$ELSE} if IsCJ_Affiliates then sUserName := CJ_EMPTY_EMPNO; {$IFDEF _LOTTEMART_} // NAC에서 유저 ID값 가져오기 25_0120 10:10:54 kku var sNacHostName: String := GetRegValueAsString(HKEY_LOCAL_MACHINE, 'SOFTWARE\Geni\Genian\Common', 'Auth'); if sNacHostName.Length > 2 then begin // MT는 롯데마트, SP는 롯데슈퍼 if sNacHostName.ToUpper.StartsWith('MT') or sNacHostName.ToUpper.StartsWith('SP') then Delete(sNacHostName, 1, 2); sUserName := sNacHostName; end; {$ENDIF} {$IFDEF _KBIZ_} // 레지스트리에서 AD 계정 획득 24_0724 15:08:23 kku var sAdHostName: String := GetRegValueAsString(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'DefaultUserName'); // 보완 24_0108 12:57:40 kku if sAdHostName = '' then sAdHostName := GetRegValueAsString(HKEY_CURRENT_USER, 'Volatile Environment', 'USERNAME'); // if sAdHostName = '' then // sAdHostName := GetRegValueAsString(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\DataStore\Machine\0', 'szTargetName'); // // if sAdHostName = '' then // sAdHostName := GetRegValueAsString(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName', 'ComputerName'); if sAdHostName <> '' then sUserName := sAdHostName; {$ENDIF} {$IFDEF _UNITUS_} sUserName := GetRegValueAsString(HKEY_CURRENT_USER, 'SOFTWARE\CKBS\CKPORT\USR', 'USERID'); if sUserName = '' then begin sUserName := ExtractFileName(GetADUserName); if Pos('(', sUserName) > 0 then begin var sTemp: String := GetCapsuleStr('(', ')', sUserName); if sTemp <> '' then sUserName := sTemp; end; end; {$ENDIF} {$IFDEF _MOTRAS_} sUserName := GetRegValueAsString(HKEY_CURRENT_USER, 'Software\Microsoft\Office\16.0\Common\Identity', 'ADUserName'); if sUserName <> '' then begin var nPos: Integer := Pos('@', sUserName); if nPos > 0 then SetLength(sUserName, nPos - 1); end else sUserName := ExtractFileName(GetADUserName); var sTemp: String := ExtrNumStr(sUserName); if sTemp.Length <> 7 then begin // 7자리 숫자가 아니라면 호스트 이름 확인해서 사번을 가져온다. 25_0618 09:00:32 kku sTemp := GetComName; if sTemp.Length >= 7 then sUserName := Copy(sTemp, 1, 7); end; {$ENDIF} if sUserName = '' then begin sUserName := GetAccount; if (sUserName = '') or (CompareText(sUserName, 'system') = 0) then sUserName := ExtractFileName(GetUserNameFromExplorer); end; edEmpNo.Text := sUserName; edVpnId.Text := edEmpNo.Text; // edEmpNo.Text; {$ENDIF} end; ProcessInstall(Self, true); // 에이전트 설치 후 팝업을 위해 실행될때까지 기다린다. // 사일런트 설치는 완료 후 팝업되지 않도록 수정 22_0816 08:17:24 kku // nTO := 0; // while not MutexExists(MUTEX_AGENT) do // begin // Sleep(500); // Inc(nTO); // if nTO > 20 then // break; // end; {$ENDIF} Close; 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.edEmpNoKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key := #0; imgNextClick(nil); exit; 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(GetLangRes(RS_Q_Delete, RS_S_Q_Delete)), 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); SetBoldEntProg(4); tExit.Enabled := true; imgInstalled.Visible := false; lbCompleted.Caption := GetLangRes(RS_DeleteComp, RS_S_DeleteComp); lbCompletedMsg.Caption := GetLangRes(RS_MsgDeleted, RS_S_MsgDeleted); cpMain.ActiveCard := cdCompleted; Application.ProcessMessages; end else begin MessageBox(Handle, PChar(GetLangRes(RS_MsgNoDelete, RS_S_MsgNoDelete)), 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(GetLangRes(RS_Q_Exit, RS_S_Q_Exit)), 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; function TDlgeCrmHeInstMain.LoadEmpNo: Boolean; var sDir: String; AgentModel: TAgentModel; begin Result := false; {$IFDEF _LOTTEMART_} exit; {$ENDIF} sDir := GetProgramFilesDir + DIR_HE + DIR_CONF; // 사번정보 있으면 채워주기 22_0530 08:25:01 kku Guard(AgentModel, TAgentModel.Create); AgentModel.Load(sDir + DAT_AGENT); if (edEmpNo.Text = '') and (edVpnId.Text = '') then begin edEmpNo.Text := AgentModel.EmpNo; // edVpnId.Text := AgentModel.VpnInfo; end; // if (edEmpNo.Text = '') and (edVpnId.Text = '') then if edEmpNo.Text = '' then begin // 구버전 정보도 확인 if FileExists(sDir + PROP_USERINFO) then begin var ss: TStringStream; var StrList: TStringList; Guard(ss, TStringStream.Create('', TEncoding.UTF8)); ss.LoadFromFile(sDir + PROP_USERINFO); Guard(StrList, TStringList.Create); if SplitString(DecryptStr(ss.DataString), '---', StrList) > 1 then begin edEmpNo.Text := StrList[0]; edVpnId.Text := StrList[1]; end; end; end; Result := edEmpNo.Text <> ''; 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); SetBoldEntProg(1); end; 1 : begin {$IFDEF _KFTC_} var dlg: TDlgUserInfoAgree; Guard(dlg, TDlgUserInfoAgree.Create(Self)); if dlg.ShowModal <> mrOk then exit; // cpMain.ActiveCard := cdUserInfoAgree; // // imgNext.Enabled := rdAgree2.Checked; // if imgNext.Enabled then // SetImgBtn(imgBtns2, imgNext, imgNext.Tag) // else // SetImgBtn(imgBtns2, imgNext, imgNext.Tag + 1); // SetImgCtrl(imgProgs, imgProg, 1); {$ENDIF} cpMain.ActiveCard := cdInfo; LoadEmpNo; SetImgCtrl(imgProgs, imgProg, 2); SetBoldEntProg(2); end; 2 : begin edEmpNo.Text := Trim(edEmpNo.Text); edVpnId.Text := Trim(edVpnId.Text); if edEmpNo.Text = '' then begin if IsCJ_Affiliates then MessageBox(Handle, PChar(GetLangRes(RS_InputEmpNo2, RS_S_InputEmpNo2)), PChar(Caption), MB_ICONWARNING or MB_OK) else MessageBox(Handle, PChar(GetLangRes(RS_InputEmpNo, RS_S_InputEmpNo)), PChar(Caption), MB_ICONWARNING or MB_OK); edEmpNo.SetFocus; exit; end; if Length(edEmpNo.Text) > 24 then begin MessageBox(Handle, PChar('Please enter within 24 characters.'), 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; if chCheckEmpNo.Checked then begin if IsCJ_Affiliates then begin // if sEmpNoVerifyOK_ <> edEmpNo.Text then // begin // MessageBox(Handle, PChar('먼저 ID 조회를 시도해 주십시오.'), PChar(Caption), MB_ICONWARNING or MB_OK); // exit; // end; if not ProcessCheckId_CJONS then exit; end; if (sEmpNoVerifyOK_ <> edEmpNo.Text) and not CheckEmpNo then begin if IsCJ_Affiliates then MessageBox(Handle, PChar(GetLangRes(RS_InvaludEmpNo2, RS_S_InvaludEmpNo2)), PChar(Caption), MB_ICONWARNING or MB_OK) else MessageBox(Handle, PChar(GetLangRes(RS_InvaludEmpNo, RS_S_InvaludEmpNo)), PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; end; {$IFDEF _SERVE1_} if MessageBox(Handle, PChar('설치가 완료되면 자동으로 재부팅 됩니다.'+ #13+#10+'계속하시겠습니까?'), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit; {$ENDIF} cpMain.ActiveCard := cdInstall; SetImgCtrl(imgProgs, imgProg, 3); SetBoldEntProg(3); imgPrev.Enabled := false; SetImgBtn(imgBtns2, imgPrev, imgPrev.Tag + 1); imgExit.Enabled := false; try imgNext.Enabled := false; SetImgBtn(imgBtns2, imgNext, imgNext.Tag + 1); if ProcessInstall(Self, false) then begin imgNext.Enabled := true; SetImgBtn(imgBtns2, imgNext, imgNext.Tag); // {$IF Defined(_SERVE1_) or Defined(_CJONS_)} // 전체 적용 25_0110 14:17:44 kku imgNextClick(nil); // {$IFEND} end else MessageBox(Handle, PChar('An error occurred during installation.'), PChar(Caption), MB_ICONSTOP or MB_OK); finally imgExit.Enabled := true; end; end; 3 : begin cpMain.ActiveCard := cdCompleted; imgPrev.Visible := false; imgNext.Tag := 4; SetImgBtn(imgBtns2, imgNext, imgNext.Tag); SetImgCtrl(imgProgs, imgProg, 4); SetBoldEntProg(4); // 서비스를 숨기면 윈도우 메이저 업데이트 시 서비스가 사라지는 문제가 있음 24_0105 08:18:24 kku // SetVisibleService(NAME_SERVICE, false); {$IFDEF _SERVE1_} var sUnInst: String := GetProgramFilesDir + DIR_HE + DIR_CONF + 'InstallCleaner.exe'; if FileExists(sUnInst) then begin // 2번 실행하게 요청 24_0717 14:37:11 kku ExecuteAppWaitUntilTerminate(sUnInst, '', SW_NORMAL, 10000); Sleep(1000); if ExecuteAppWaitUntilTerminate(sUnInst, '', SW_NORMAL, 10000) then begin Sleep(500); if not ServiceExists(NAME_SERVICE) then begin var sSysDir: String := GetSystemDir; var sInstDir: String := GetProgramFilesDir + DIR_HE; if not FileExists(sSysDir + DLL_SV) then MoveFile(PChar(sInstDir + DLL_SV), PChar(sSysDir + DLL_SV)); InstallService(NAME_SERVICE, sSysDir + EXE_SV, NAME_SERVICE, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START); Sleep(500); end; DeleteFile_wait(sUnInst); // if MessageBox(Handle, PChar('설치를 완료했습니다. 재부팅 하시겠습니까?'), // PChar(APP_NAME_BS1), MB_ICONQUESTION or MB_YESNO) = IDYES then begin ExecutePath('shutdown', '/f /r /t 0'); end; end; end; {$ELSE} lbExitMsg.Visible := true; _nExitSec := 5; tExit.Enabled := true; {$ENDIF} // 나중에 시작하도록 보완 22_0510 15:13:29 kku // 완료 페이지에서 자동 닫기 카운될때 프로그램이 팝업 되야 더 좋을듯 함 ServiceStart(NAME_SERVICE); end; 6 : begin cpMain.ActiveCard := cdInfo; LoadEmpNo; SetImgCtrl(imgProgs, imgProg, 2); SetBoldEntProg(2); 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); SetBoldEntProg(0); end; 2 : begin // {$IFDEF _KFTC_} // cpMain.ActiveCard := cdUserInfoAgree; // SetImgCtrl(imgProgs, imgProg, 1); // {$ELSE} cpMain.ActiveCard := cdLicense; SetImgCtrl(imgProgs, imgProg, 1); SetBoldEntProg(1); // {$ENDIF} end; 6 : begin 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); SetBoldEntProg(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 TRadioButton(Sender).Checked then begin SetImgBtn(imgBtns2, imgNext, imgNext.Tag); imgNext.Enabled := true; end; end; procedure TDlgeCrmHeInstMain.rdNoAgreeClick(Sender: TObject); begin if TRadioButton(Sender).Checked then begin SetImgBtn(imgBtns2, imgNext, imgNext.Tag + 1); imgNext.Enabled := false; end; end; end.