//--------------------------------------------------------------------------- void __fastcall TForm1::cmdExitClick(TObject *Sender) { if (ProgressBar1->Visible == true) { if (ProgressBar1->Position == 0) { ChangeFormStatus(0); //メインフォームへ戻る return; } else if (ProgressBar1->Position == 100) { Close(); } else{ if (decrypt != NULL) { decrypt->Terminate(); return; } else{ ChangeFormStatus(0); //メインフォームへ戻る return; } } } else{ Close(); } }
//--------------------------------------------------------------------------- //復号処理スレッドの終了 //--------------------------------------------------------------------------- void __fastcall TForm1::DecryptThreadTerminated(TObject *Sender) { ProgressBar1->Style = pbstNormal; ProgressBar1->Position = decrypt->ProgressPercentNum; lblProgressPercentNum->Caption = IntToStr(decrypt->ProgressPercentNum)+"%"; lblStatus->Caption = decrypt->ProgressStatusText; lblMsg->Caption = decrypt->ProgressMsgText; if(ptl){ ptl->SetProgressValue(Application->Handle, 100, 100); ptl->Release(); ptl = NULL; } TimerDecrypt->Enabled = false; //復号に成功 if ( decrypt->StatusNum > 0 ) { decrypt = NULL; } //復号エラー else{ //パスワード入力エラーで抜けてきた if ( decrypt->StatusNum == -1 ) { //メインパネルへ戻る ChangeFormStatus(0); RetryNum++; //パスワード入力回数制限を超えた if ( RetryNum > decrypt->TypeLimits ) { //実行ファイルは自身を書き換えられないので終了するだけ decrypt = NULL; Application->Terminate(); } } //エラー else if ( decrypt->StatusNum == -2 ) { } //ユーザーキャンセル else{ } //エラーで終了してきた decrypt = NULL; } }
//--------------------------------------------------------------------------- // ファイルを復号する処理 //--------------------------------------------------------------------------- void __fastcall TForm1::FileDecrypt(void) { int i; String MsgText; char password[32]; for (i = 0; i < 32; i++) { password[i] = NULL; } AnsiString Password; AnsiString PasswordFileHash, PasswordFileHeader; String AtcFilePath; String OutDirPath; String RootDirPath = ExtractFileDir(Application->ExeName); TSelectDirExtOpts opt; //フォームを実行中状態にする ChangeFormStatus(1); //親フォルダを生成しない //if ( fNoParentFldr == true ) if ( chkSaveToOtherDirectory->Checked == true ) { opt = TSelectDirExtOpts() << sdShowShares << sdNewUI << sdNewFolder << sdShowEdit << sdValidateDir; // '復号する先のフォルダーを指定してください。' if (SelectDirectory(LoadResourceString(&Msgexeout::_DIALOG_MSG_SELECT_SAVE_TO_FOLDER), RootDirPath, OutDirPath, opt, this) == false){ return; } } else{ OutDirPath = ExtractFileDir(Application->ExeName); } if ( DirectoryExists(OutDirPath) == false ) { //'保存する先のフォルダーが見つかりません。保存設定を再確認してください。'+#13+ //'復号処理化を中止します。'; MsgText = LoadResourceString(&Msgexeout::_MSG_ERROR_SAVE_DEC_TO_FOLDER_NOT_EXISTS)+"\n"+ OutDirPath; MessageDlg(MsgText, mtError, TMsgDlgButtons() << mbOK, 0); //エラー終了表示 ProgressBar1->Position = 0; lblProgressPercentNum->Caption = " - %"; //'キャンセル' lblStatus->Caption = LoadResourceString(&Msgexeout::_LABEL_STATUS_TITLE_USER_CANCEL); //'復号が中止されました。' lblMsg->Caption = LoadResourceString(&Msgexeout::_LABEL_STATUS_DETAIL_STOPPED); return; } //----------------------------------- // 復号処理の開始 //----------------------------------- //復号処理インスタンスの作成 decrypt = new TAttacheCaseFileDecrypt2(true); decrypt->OnTerminate = DecryptThreadTerminated; decrypt->FreeOnTerminate = true; decrypt->AppExeFilePath = Application->ExeName; //アタッシェケース本体の場所(実行形式出力のときに参照する) decrypt->AtcFilePath = Application->ExeName; //入力する暗号化ファイルパス(自分自身) decrypt->OutDirPath = OutDirPath; //出力するディレクトリ decrypt->fConfirmOverwirte = true; //上書きの確認 //----------------------------------- //パスワードのセット //----------------------------------- //パスワードファイルを使用する if (PasswordFilePath != "") { //SHA-1ハッシュを求める if ( GetSHA1HashFromFile(PasswordFilePath, PasswordFileHash, PasswordFileHeader) == true ){ StrLCopy(password, PasswordFileHash.c_str(), 32); decrypt->SetPasswordBinary(password); FileDecrypt(); } else{ //'パスワードファイルを開けません。他のアプリケーションで使用中の可能性があります。'; MsgText = LoadResourceString(&Msgexeout::_MSG_ERROR_OPEN_PASSWORD_FILE)+"\n"+PasswordFilePath; MessageDlg(MsgText, mtError, TMsgDlgButtons() << mbOK, 0); } } else{ //文字列をセット Password = (AnsiString)txtInputPassword->Text; StrLCopy(password, Password.c_str(), 32); decrypt->SetPasswordBinary(password); } //復号の実行 decrypt->Start(); //タスクバー進捗表示(Win7) if(CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3, (void**)&ptl) != S_OK) { //失敗 } if (ptl) ptl->SetProgressState(Application->Handle, TBPF_NORMAL); //進捗をTimerで監視 TimerDecrypt->Enabled = true; }