From b356c23a4569cb88cc54ef80fe24aaaa3d653bc8 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 30 Mar 2015 06:46:52 +0000 Subject: [PATCH] =?UTF-8?q?KeyGenerator=201.6c6=20:=20-=20possibilit=C3=A0?= =?UTF-8?q?=20di=20caricare=20file=20Kge=20-=20generazione=20file=20lic.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KeyGenerator.cpp | 15 ++++-- KeyGenerator.rc | Bin 21486 -> 24636 bytes KeyGeneratorDlg.cpp | 124 +++++++++++++++++++++++++++++++++----------- KeyGeneratorDlg.h | 9 +++- KeyMaker.cpp | 112 ++++++++++++++++++++++++++++++++------- KeyMaker.h | 4 ++ resource.h | Bin 3852 -> 3856 bytes 7 files changed, 208 insertions(+), 56 deletions(-) diff --git a/KeyGenerator.cpp b/KeyGenerator.cpp index 50bce41..2d39aa8 100644 --- a/KeyGenerator.cpp +++ b/KeyGenerator.cpp @@ -29,9 +29,9 @@ using namespace std ; //--------------------------- Define ----------------------------------------- #if defined( NDEBUG) - #define STR_EXE "KeyGeneratorR32.exe" + #define STR_EXE "KeyGeneratorR32.exe" #else - #define STR_EXE "KeyGeneratorD32.exe" + #define STR_EXE "KeyGeneratorD32.exe" #endif @@ -83,11 +83,18 @@ CKeyGeneratorApp::InitInstance( void) // verifico la protezione string sKey = GetPrivateProfileStringUtf8( "General", "Key", "", m_pszProfileName) ; - if ( VerifyKey( sKey, 1230, 15, 01) != KEY_OK) + if ( VerifyKey( sKey, 1230, 16, 10) != KEY_OK) return FALSE ; + // gestione linea di comando + string sFileToOpen ; + CCommandLineInfo cmdInfo ; + ParseCommandLine( cmdInfo) ; + if ( cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) + sFileToOpen = WtoA( cmdInfo.m_strFileName) ; + // Dialog interface - CKeyGeneratorDlg dlg ; + CKeyGeneratorDlg dlg( sFileToOpen) ; m_pMainWnd = &dlg ; dlg.DoModal() ; diff --git a/KeyGenerator.rc b/KeyGenerator.rc index a0b0a26929536a18d187a1fa81b36dc9a024e69d..ceb0d639c3da5960927a3aa0ad5b8aeeeed654b0 100644 GIT binary patch delta 3504 zcmc&$%W4!s6up!9NJ3%=!G*~tlZYB;5@vdOsz-F8CJMg&gP;?G5AXp7lq?$Y6KW%f zxKpx`z$|p(!hkCg!JW9u!nKeu(0jW2c2y^n?nxrZz|d7)b?cmS&%M>Z-xfZ8Dy-bz zr~AjhXm9_I0Yzo1lF$DhRrR5sXM;6w=q5d-G5xAi)UyXh zhOyQoiGnx{U7a}7t*E9KCnj4Tdf#<**GRSQ^w$m+X7tNqNgp0PesY@d8|U>GXqIMZ zj;_&lI!9OOJkMO_r!v32LJQQSv$RN$`S*bCV}~w|j7H~Hsm7}edVX%L7MJ(*0t%*; zo|~R5sMhNvgWY=-M^XCwu_?Va`C>@8B&_t3_g@6%s{k=DatyjQQC>IpaV9Aj;tFzA3$mRVsuRidW~4Nzb7 z)~9)%H}A39=aC=jZgvNp8$ZgNjD3!Re3-GKTfBOK%3(ZF=Kys~#N&WYY}ioe4fa4B zSK}a9FQ7c$p9ZCP)qD~YfUwJ+;Zq2tG66&`N&o^Xvr^a$3S*}qbby{xdXpM^65%~?sCTp8`D&%mTODUjWMAxW0 z2N~x-2PGf3bt$DmStI6G6KffAU@=kD79HtON|0OL8`h0vj04>FX1_6|fC6wwZjJ^c zSCbf=e;i_KdM8c9Ex#<*0?L$pL_Cbz>Az&&#$*}k^sr{F_;KyNG(^Y$>)xxc8rdwMs4N~Cuf@k07Y)B&yyPM*ms-{6Y~ zPJU?efAb056h^EXwV6>hO%BlBGFist2+-7rCX<;a%V}~*`Y^aMxG{t<_%b*$1TnZX zcry3_ouI&AK3Pyxbh4j?6ssZ7FUBCAcnE_(LjYEl;iF5MLoadIcon( IDR_MAINFRAME) ; + // eventuale file da caricare all'avvio + m_sFileToOpen = sFileToOpen ; } //---------------------------------------------------------------------------- @@ -119,7 +122,8 @@ BEGIN_MESSAGE_MAP( CKeyGeneratorDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() - ON_BN_CLICKED( ID_GENER, OnGenerate) + ON_BN_CLICKED( IDC_OPENFILE, OnOpenFile) + ON_BN_CLICKED( IDC_GENER, OnGenerate) ON_WM_CLOSE() END_MESSAGE_MAP() @@ -129,7 +133,7 @@ CKeyGeneratorDlg::OnInitDialog( void) { CDialogEx::OnInitDialog() ; - // Add "About..." menu item to system menu. + // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); @@ -147,26 +151,20 @@ CKeyGeneratorDlg::OnInitDialog( void) } } - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog SetIcon( m_hIcon, TRUE) ; // Set big icon SetIcon( m_hIcon, FALSE) ; // Set small icon - // Assegno ultimi valori inseriti - string sCust = GetPrivateProfileStringUtf8( "Data", "Customer", "", AfxGetApp()->m_pszProfileName) ; - GetDlgItem( IDC_CUSTOMER)->SetWindowTextW( stringtoW( sCust)) ; - string sMachId = GetPrivateProfileStringUtf8( "Data", "MachineId", "", AfxGetApp()->m_pszProfileName) ; - GetDlgItem( IDC_MACHID)->SetWindowTextW( stringtoW( sMachId)) ; - int nSelProd = GetPrivateProfileInt( "Data", "SelProduct", 0, AfxGetApp()->m_pszProfileName) ; - ((CComboBox*)GetDlgItem( IDC_PROD))->SetCurSel( nSelProd) ; - int nSelVer = GetPrivateProfileInt( "Data", "SelVer", 0, AfxGetApp()->m_pszProfileName) ; - ((CComboBox*)GetDlgItem( IDC_VER))->SetCurSel( nSelVer) ; - int nSelLev = GetPrivateProfileInt( "Data", "SelLev", 0, AfxGetApp()->m_pszProfileName) ; - ((CComboBox*)GetDlgItem( IDC_LEV))->SetCurSel( nSelLev) ; - int nExpTime = GetPrivateProfileInt( "Data", "ExpTime", 0, AfxGetApp()->m_pszProfileName) ; - if ( nExpTime != 0) - ((CDateTimeCtrl*)GetDlgItem( IDC_EXPIRATION))->SetTime( &CTime( nExpTime)) ; + // eventuale apertura o esecuzione di file all'avvio + if ( ! m_sFileToOpen.empty()) { + // leggo il file + if ( LoadFile( m_sFileToOpen.c_str())) + return TRUE ; + } + // Assegno ultimi valori inseriti + LoadFile( WtoA( AfxGetApp()->m_pszProfileName)) ; return TRUE ; // return TRUE unless you set the focus to a control } @@ -228,6 +226,69 @@ CKeyGeneratorDlg::OnClose( void) EndDialog( IDCANCEL) ; } +//---------------------------------------------------------------------------- +void +CKeyGeneratorDlg::OnOpenFile( void) +{ + // visualizzo il dialogo di scelta file + CFileDialog dlg( TRUE, L"*.Kge", NULL, + OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR, + L"Key info EgalTech (*.Kge)|*.Kge||", NULL, 0, FALSE) ; + + // imposto il direttorio iniziale + wstring wsDir = stringtoW( GetPrivateProfileStringUtf8( "General", "DataDir", "", AfxGetApp()->m_pszProfileName)) ; + if ( ! wsDir.empty()) + dlg.m_ofn.lpstrInitialDir = wsDir.c_str() ; + + // lancio il dialogo di scelta file + if ( dlg.DoModal() != IDOK) + return ; + + // leggo il file + LoadFile( WtoA( dlg.GetPathName())) ; +} + +//---------------------------------------------------------------------------- +bool +CKeyGeneratorDlg::LoadFile( const char* szFile) +{ + // verifico validità nome file + if ( szFile == nullptr || szFile[0] == '\0') + return false ; + // leggo indice ultimo salvataggio + int nLast = GetPrivateProfileInt( "Index", "Last", 0, szFile) ; + // carico i dati del file + string sSec = "Licence" ; + if ( nLast > 0) + sSec += ToString( nLast) ; + string sCust = GetPrivateProfileStringUtf8( sSec.c_str(), "Customer", "", szFile) ; + GetDlgItem( IDC_CUSTOMER)->SetWindowTextW( stringtoW( sCust)) ; + string sMachId = GetPrivateProfileStringUtf8( sSec.c_str(), "MachineId", "", szFile) ; + GetDlgItem( IDC_MACHID)->SetWindowTextW( stringtoW( sMachId)) ; + int nProd = GetPrivateProfileInt( sSec.c_str(), "Product", 0, szFile) ; + ((CComboBox*)GetDlgItem( IDC_PROD))->SetCurSel( nProd - 1230) ; + int nVer = GetPrivateProfileInt( sSec.c_str(), "Ver", 0, szFile) ; + ((CComboBox*)GetDlgItem( IDC_VER))->SetCurSel( nVer - 15) ; + int nLev = GetPrivateProfileInt( sSec.c_str(), "Lev", 0, szFile) ; + ((CComboBox*)GetDlgItem( IDC_LEV))->SetCurSel( nLev - 1) ; + int nExpTime = GetPrivateProfileInt( sSec.c_str(), "ExpDays", 0, szFile) ; + if ( nExpTime != 0) + ((CDateTimeCtrl*)GetDlgItem( IDC_EXPIRATION))->SetTime( &CTime( nExpTime * 24 * 3600)) ; + int nOpt1 = GetPrivateProfileInt( sSec.c_str(), "Opt1", 0, szFile) ; + for ( int i = IDC_CHECK01, j = 0 ; i <= IDC_CHECK16 ; ++ i, ++ j) { + if ( ( nOpt1 & ( 1 << j)) != 0) + ((CButton*)GetDlgItem( i))->SetCheck( BST_CHECKED) ; + else + ((CButton*)GetDlgItem( i))->SetCheck( BST_UNCHECKED) ; + } + int nOpt2 = GetPrivateProfileInt( sSec.c_str(), "Opt2", 0, szFile) ; + // check non ancora inseriti nel dialogo + int nOptExpTime = GetPrivateProfileInt( sSec.c_str(), "OptExpDays", 0, szFile) ; + if ( nOptExpTime != 0) + ((CDateTimeCtrl*)GetDlgItem( IDC_OPT_EXPIR))->SetTime( &CTime( nOptExpTime * 24 * 3600)) ; + return true ; +} + //---------------------------------------------------------------------------- void CKeyGeneratorDlg::OnGenerate( void) @@ -242,7 +303,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Dati cliente vuoto o con caratteri vietati (\\/:*?\"<>|)") ; return ; } - WritePrivateProfileStringUtf8( "Data", "Customer", sCust.c_str(), AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "Customer", sCust.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero l'identificativo macchina (tipo 2) GetDlgItem( IDC_MACHID)->GetWindowTextW( wszTemp) ; string sMachId = wstrztoA( wszTemp) ; @@ -250,7 +311,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Id Macchina vuoto o errato") ; return ; } - WritePrivateProfileStringUtf8( "Data", "MachineId", sMachId.c_str(), AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "MachineId", sMachId.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero il prodotto GetDlgItem( IDC_PROD)->GetWindowTextW( wszTemp) ; string sProd = wstrztoA( wszTemp) ; @@ -258,9 +319,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Prodotto vuoto o errato") ; return ; } - int nSelProd = ((CComboBox*)GetDlgItem( IDC_PROD))->GetCurSel() ; - nSelProd = max( nSelProd, 0) ; - WritePrivateProfileInt( "Data", "SelProduct", nSelProd, AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "Product", sProd.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero la versione GetDlgItem( IDC_VER)->GetWindowTextW( wszTemp) ; string sVer = wstrztoA( wszTemp) ; @@ -268,9 +327,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Versione vuota o errata") ; return ; } - int nSelVer = ((CComboBox*)GetDlgItem( IDC_VER))->GetCurSel() ; - nSelVer = max( nSelVer, 0) ; - WritePrivateProfileInt( "Data", "SelVer", nSelVer, AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "Ver", sVer.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero il livello GetDlgItem( IDC_LEV)->GetWindowTextW( wszTemp) ; string sLev = wstrztoA( wszTemp) ; @@ -278,9 +335,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Livello vuoto o errato") ; return ; } - int nSelLev = ((CComboBox*)GetDlgItem( IDC_LEV))->GetCurSel() ; - nSelLev = max( nSelLev, 0) ; - WritePrivateProfileInt( "Data", "SelLev", nSelLev, AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "Lev", sLev.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero la data di scadenza int nDays ; CTime tTime ; @@ -292,7 +347,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Inserisci una Data valida") ; return ; } - WritePrivateProfileInt( "Data", "ExpTime", int( tTime.GetTime()), AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileInt( "Licence", "ExpDays", nDays, AfxGetApp()->m_pszProfileName) ; // recupero le opzioni unsigned int nOpt1 = 0 ; for ( int i = IDC_CHECK01, j = 0 ; i <= IDC_CHECK16 ; ++ i, ++ j) { @@ -304,6 +359,8 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Inserisci Opzioni valide") ; return ; } + WritePrivateProfileInt( "Licence", "Opt1", nOpt1, AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileInt( "Licence", "Opt2", nOpt2, AfxGetApp()->m_pszProfileName) ; // recupero la data di scadenza delle opzioni int nOptDays ; CTime tOptTime ; @@ -315,6 +372,11 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Inserisci una Data valida per le opzioni") ; return ; } + WritePrivateProfileInt( "Licence", "OptExpDays", nOptDays, AfxGetApp()->m_pszProfileName) ; + // verifico la protezione + string sPKey = GetPrivateProfileStringUtf8( "General", "Key", "", AfxGetApp()->m_pszProfileName) ; + if ( VerifyKey( sPKey, 1230, 16, 10) != KEY_OK) + return ; // calcolo la chiave if ( ! mKey.CalcKey()) { AfxMessageBox( L"Errore nel calcolo della chiave") ; diff --git a/KeyGeneratorDlg.h b/KeyGeneratorDlg.h index 4b59f61..c6cb20d 100644 --- a/KeyGeneratorDlg.h +++ b/KeyGeneratorDlg.h @@ -19,11 +19,12 @@ class CKeyGeneratorDlg : public CDialogEx { public : - CKeyGeneratorDlg( CWnd* pParent = NULL) ; + CKeyGeneratorDlg( const std::string& sFileToOpen, CWnd* pParent = NULL) ; protected: virtual void OnCancel( void) ; afx_msg void OnClose( void) ; + afx_msg void OnOpenFile( void) ; afx_msg void OnGenerate( void) ; protected : @@ -32,8 +33,12 @@ class CKeyGeneratorDlg : public CDialogEx afx_msg void OnPaint( void) ; afx_msg HCURSOR OnQueryDragIcon( void) ; - protected : + private : + bool LoadFile( const char* szFile) ; + + private : HICON m_hIcon ; + std::string m_sFileToOpen ; DECLARE_MESSAGE_MAP() } ; diff --git a/KeyMaker.cpp b/KeyMaker.cpp index cea2ff3..f9cec26 100644 --- a/KeyMaker.cpp +++ b/KeyMaker.cpp @@ -164,28 +164,102 @@ KeyMaker::GetKey( string& sKey) bool KeyMaker::SaveData( void) { - // determino path file di salvataggio + // direttorio di salvataggio string sDataDir = GetPrivateProfileStringUtf8( "General", "DataDir", "C:/EgtProg/KeyGenerator", AfxGetApp()->m_pszProfileName) ; TrimRight( sDataDir, "/\\") ; - string sFile = sDataDir + "/" + m_sCustomer + ".Kge" ; - // apro il file - ofstream ofOut( stringtoW( sFile), ios_base::out | ios_base::app) ; + + // path file di log + string sLogFile = sDataDir + "\\" + m_sCustomer + ".Kge" ; + // leggo indice ultimo salvataggio + int nLast = GetPrivateProfileInt( "Index", "Last", 0, sLogFile.c_str()) ; + // assegno nome sezione + string sSec = "Licence" + ToString( nLast) ; + // se cambiati i dati, aggiungo nuova versione di licenza + if ( DiffLicence( sLogFile.c_str())) { + // salvo nuovo indice salvataggio + ++ nLast ; + WritePrivateProfileInt( "Index", "Last", nLast, sLogFile.c_str()) ; + // aggiorno nome sezione + sSec = "Licence" + ToString( nLast) ; + // salvo i nuovi dati + if ( ! WriteLicence( sSec.c_str(), sLogFile.c_str(), true)) + return false ; + } + + // path file licenza + string sLicFile = sDataDir + "\\" + m_sCustomer + "_" + sSec + ".lic" ; + // linea per evitare problemi con BOM + ofstream ofOut( stringtoW( sLicFile), ios_base::out | ios_base::trunc) ; if ( ! ofOut.good()) return false ; - // inserisco la data - ofOut << CurrDateTime() << endl ; - ofOut << "Customer=" << m_sCustomer << endl ; - ofOut << "MachineId=" << m_sMachineId2 << endl ; - ofOut << "ClearMachineId=" << m_sMachineId << endl ; - ofOut << "Product=" << m_nProd << endl ; - ofOut << "Ver=" << m_nVer << endl ; - ofOut << "Lev=" << m_nLev << endl ; - ofOut << "ExpDays=" << m_nExpDays << endl ; - ofOut << "Opt1=" << m_nOpt1 << endl ; - ofOut << "Opt2=" << m_nOpt2 << endl ; - ofOut << "OptExpDays=" << m_nOptExpDays << endl ; - ofOut << "Key=" << m_sKey << endl ; - // chiudo il file + ofOut << "; Commento per evitare BOM con UTF-8" << endl ; ofOut.close() ; - return true ; + // salvo i nuovi dati + return WriteLicence( "Licence", sLicFile.c_str(), false) ; } + +//---------------------------------------------------------------------------- +bool +KeyMaker::DiffLicence( const char* szFile) +{ + // leggo indice ultimo salvataggio + int nLast = GetPrivateProfileInt( "Index", "Last", 0, szFile) ; + // sezione ultimo salvataggio + string sSec = "Licence" + ToString( nLast) ; + // leggo i dati dell'ultimo salvataggio e li confronto con gli attuali + string sCust = GetPrivateProfileStringUtf8( sSec.c_str(), "Customer", "", szFile) ; + if ( sCust != m_sCustomer) + return true ; + string sMachId = GetPrivateProfileStringUtf8( sSec.c_str(), "MachineId", "", szFile) ; + if ( sMachId != m_sMachineId2) + return true ; + string sClearMachId = GetPrivateProfileStringUtf8( sSec.c_str(), "ClearMachineId", "", szFile) ; + if ( sClearMachId != m_sMachineId) + return true ; + int nProd = GetPrivateProfileInt( sSec.c_str(), "Product", 0, szFile) ; + if ( nProd != m_nProd) + return true ; + int nVer = GetPrivateProfileInt( sSec.c_str(), "Ver", 0, szFile) ; + if ( nVer != m_nVer) + return true ; + int nLev = GetPrivateProfileInt( sSec.c_str(), "Lev", 0, szFile) ; + if ( nLev != m_nLev) + return true ; + int nExpDays = GetPrivateProfileInt( sSec.c_str(), "ExpDays", 0, szFile) ; + if ( nExpDays != m_nExpDays) + return true ; + int nOpt1 = GetPrivateProfileInt( sSec.c_str(), "Opt1", 0, szFile) ; + if ( nOpt1 != m_nOpt1) + return true ; + int nOpt2 = GetPrivateProfileInt( sSec.c_str(), "Opt2", 0, szFile) ; + if ( nOpt2 != m_nOpt2) + return true ; + int nOptExpDays = GetPrivateProfileInt( sSec.c_str(), "OptExpDays", 0, szFile) ; + if ( nOptExpDays != m_nOptExpDays) + return true ; + string sKey = GetPrivateProfileStringUtf8( sSec.c_str(), "Key", "", szFile) ; + if ( sKey != m_sKey) + return true ; + return false ; +} + +//---------------------------------------------------------------------------- +bool +KeyMaker::WriteLicence( const char* szSec, const char* szFile, bool bAll) +{ + if ( bAll) + WritePrivateProfileStringUtf8( szSec, "Date", CurrDateTime().c_str(), szFile) ; + WritePrivateProfileStringUtf8( szSec, "Customer", m_sCustomer.c_str(), szFile) ; + WritePrivateProfileStringUtf8( szSec, "MachineId", m_sMachineId2.c_str(), szFile) ; + if ( bAll) + WritePrivateProfileStringUtf8( szSec, "ClearMachineId", m_sMachineId.c_str(), szFile) ; + WritePrivateProfileInt( szSec, "Product", m_nProd, szFile) ; + WritePrivateProfileInt( szSec, "Ver", m_nVer, szFile) ; + WritePrivateProfileInt( szSec, "Lev", m_nLev, szFile) ; + WritePrivateProfileInt( szSec, "ExpDays", m_nExpDays, szFile) ; + WritePrivateProfileInt( szSec, "Opt1", m_nOpt1, szFile) ; + WritePrivateProfileInt( szSec, "Opt2", m_nOpt2, szFile) ; + WritePrivateProfileInt( szSec, "OptExpDays", m_nOptExpDays, szFile) ; + WritePrivateProfileStringUtf8( szSec, "Key", m_sKey.c_str(), szFile) ; + return true ; +} \ No newline at end of file diff --git a/KeyMaker.h b/KeyMaker.h index da0e8d0..ceea631 100644 --- a/KeyMaker.h +++ b/KeyMaker.h @@ -33,6 +33,10 @@ class KeyMaker bool GetKey( std::string& sKey) ; bool SaveData( void) ; + private : + bool DiffLicence( const char* szFile) ; + bool WriteLicence( const char* szSec, const char* szFile, bool bAll) ; + private : std::string m_sCustomer ; std::string m_sMachineId ; diff --git a/resource.h b/resource.h index d0173a8a1bd5193d5073a6dc1240ec42eb494370..b7afe04ae1aea585b14187af9df4ce0a30e25bcb 100644 GIT binary patch delta 227 zcmWm2ziYxk7>DsUnp`f)nW>A*(Qft>luH+v;8K4;vBja2LnrZ15OH>rBK>Zi1Uri$ zNO7vrxuZC?E(LM!+}G*D^Gx(qF9$9@vaZ*lTWaIVO)$#}Y}{S$o*vGR>eQk;Y%|yR zjwQZ4jj5Ny2#pgvW}70#K^QEBMd}+U-{O_+vw!R-+mQyB(qh4mWCb!PVb9$Q3b4Tq zbXdTV9fk(Y&|=5Fu{JUn?G=IYmR5|ra2 H*74&%#;HVj delta 204 zcmWN^JqQ6|9LMp~o#)Ll-C%lR(-Wm92Bq7)Oa_BVG0Dg#nN5=XHj_bF49cP#Wj4xe zQM%deKYaW2-RPA*&pbYGT2901An#SNcNrq@i8vYJk<@6j5Qb?S$R*QT9^%am#@r(0 z26u8t=7hzMT##L1@DgR5L=hEfp`^iv9LYkWhN)Y^P%_+PpDLiKD$vT{pe*LfY*Q9b j+CFJh23K-T2EN6YocLweI