?? decryptformfile.cpp
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MyClassFile.h"
#include "EncryptFormFile.h"
#include "AddShellFormFile.h"
#include "AboutFormFile.h"
#include "DecryptFormFile.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "XPMenu"
#pragma link "DiskInfo"
#pragma link "Explform"
#pragma resource "*.dfm"
TDecryptForm *DecryptForm;
TMyClass *MyClass; //作者自定義的類
TPascalFun *PascalFun; //引用Delphi函數的類
int errornum;//輸入錯誤的次數
unsigned long BanMove,CDVOL,tmpCDVOL;
//---------------------------------------------------------------------------
__fastcall TDecryptForm::TDecryptForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::EncryptFileClick(TObject *Sender)
{
EncryptForm->Show();
this->Close();
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::StartDecryptClick(TObject *Sender)
{
if(FileList->Items->Text.Length()<1)
{
ShowMessage("請先選擇欲解密的文件!");
return;
}
int filehandle,ST,ET;
SYSTEMTIME *nowtime=new SYSTEMTIME;
unsigned long filelength;
unsigned char * pszBuffer;
bool succeed;
TStringList *DecryptFileList=new TStringList;
TStringList *UnDecryptFileList=new TStringList;
MyClass->ShowMyMessage("解密普通文件","正在解密文件......");
for(int i=0;i<FileList->Items->Count;i++) //循環解密
{
filehandle=FileOpen(FileList->Items->Strings[i],fmOpenReadWrite);
filelength=FileSeek(filehandle,0,2);
FileSeek(filehandle,0,0);
pszBuffer=new char [filelength];
FileRead(filehandle,pszBuffer,filelength);
if(pszBuffer[filelength-1]==197)//197為不使用CDVOL的標志
CDVOL=19860308;
if(pszBuffer[filelength-1]==38)//38為使用CDVOL的標志
{
CDVOL=tmpCDVOL;
}
if(pszBuffer[filelength-1]!=38&&pszBuffer[filelength-1]!=197)
{ //記錄出錯的文件
UnDecryptFileList->Add(FileList->Items->Strings[i]);
goto end;
}
if(pszBuffer[filelength-2]==197)//197為不使用BanMove的標志
BanMove=19851120;
if(pszBuffer[filelength-2]==157)//157為使用BanMove的標志
{
DiskInfo->Disk='C';
BanMove=abs(DiskInfo->SerialNumber);
}
if(pszBuffer[filelength-2]!=157&&pszBuffer[filelength-2]!=197)
{ //記錄出錯的文件
UnDecryptFileList->Add(FileList->Items->Strings[i]);
goto end;
}
ET=pszBuffer[filelength-3]-12;//24表示不使用“限時加密”
ST=pszBuffer[filelength-4]-11;
GetLocalTime(nowtime);
end:FileClose(filehandle);
delete []pszBuffer;
if((ST<=nowtime->wHour&&nowtime->wHour<=ET)||(ST==24&&ET==24))
{
if(ExtractFileExt(FileList->Items->Strings[i])==".gv")//如果是加密文件
succeed=MyClass->DecryptFile(FileList->Items->Strings[i],Password->Text,BanMove,CDVOL,3);
if(ExtractFileExt(FileList->Items->Strings[i])==".coco")//如果是加密文件包
{
succeed=MyClass->DecryptFile(FileList->Items->Strings[i],Password->Text,BanMove,CDVOL,0);
if(succeed)
{AnsiString FileName;
MyClass->Expand(FileList->Items->Strings[i]);
try
{
ADOTable->LoadFromFile(FileList->Items->Strings[i]);
ADOTable->First();//指針移到第一項數據
while(!ADOTable->Eof)//從頭讀到尾
{
FileName=ADOTable->FieldByName("FileName")->Value;
TMemoryStream *stream=new TMemoryStream;
PascalFun->LoadFromPackage(ADOTable,stream);
stream->SaveToFile(ExtractFileDir(FileList->Items->Strings[i])+"\\"+FileName);
stream->Free();
ADOTable->Next();
}
DeleteFile(FileList->Items->Strings[i]);
}
catch (...)
{
ShowMessage("讀取文件包出錯!");
}}}
if (succeed)
DecryptFileList->Add(FileList->Items->Strings[i]);
if (!succeed)
}
}
if(UnDecryptFileList->Text.Length()>1)
{//如果沒有解開一個文件,則記錄錯誤
errornum++;
}
MyClass->CloseMyMessage();//關閉提示窗口
if(DecryptFileList->Text.Length()>1)
{
ShowMessage("成功解密以下文件:\n"+DecryptFileList->Text);
TCloseAction *Action;
DecryptForm->FormClose(Sender,*Action);
errornum=0;
}
if(UnDecryptFileList->Text.Length()>1)
ShowMessage("以下文件解密失敗:\n"+UnDecryptFileList->Text);
FileList->Items->Text=UnDecryptFileList->Text;
DecryptFileList->Free();
UnDecryptFileList->Free();
switch (errornum ){
case 1: ShowMessage("文件解密失敗,請檢查您的操作是否符合“加密方式”。");break;
case 2: ShowMessage("文件解密再次失敗!不要緊,請再接再厲!"); break;
case 3: ShowMessage("很抱歉,又錯了!"); break;
case 4: ShowMessage("經過屢敗屢試之后,令我懷疑你是誰。"); Application->Terminate();break;
}
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::OpenAboutClick(TObject *Sender)
{
AboutForm->Show();
this->Close();
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::AddShellClick(TObject *Sender)
{
AddShellForm->Show();
this->Close();
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::DeleteAllClick(TObject *Sender)
{
FileList->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::DeleteSelClick(TObject *Sender)
{
//刪除所選 注:由于刪除列表后,列表的索引會出現改變,所以需要從新掃描列表
for(int i=0;i<FileList->Items->Count;i++)
{//掃描列表
if(FileList->Selected[i])
{
FileList->Items->Delete(i);
DeleteSelClick(Sender);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::PasswordKeyPress(TObject *Sender, char &Key)
{
if(int(Key)==VK_RETURN)
StartDecryptClick(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::AddFileClick(TObject *Sender)
{
TStringList *UnReadyFile = new TStringList;
OpenDialog->Execute();
if(OpenDialog->FileName.Length()>1) //如果有選擇到文件
{
for(int i=0;i<OpenDialog->Files->Count;i++)
{
if(MyClass->IsReady(OpenDialog->Files->Strings[i]))//如果準備好
FileList->Items->Add(OpenDialog->Files->Strings[i]);
if(!MyClass->IsReady(OpenDialog->Files->Strings[i]))//如果沒準備好
UnReadyFile->Add(OpenDialog->Files->Strings[i]);
}}
if(UnReadyFile->Text.Length()>1)
ShowMessage("以下文件沒有被選中,請檢查這些文件的屬性是否“只讀”或正運行著:\n"+UnReadyFile->Text);
UnReadyFile->Free();
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::ShowHint(TObject * Sender)
{
StatusBar->SimpleText=Application->Hint;
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::FormActivate(TObject *Sender)
{
DragAcceptFiles (Handle, True) ;
Application->OnHint=ShowHint;
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::ReadCDInfoClick(TObject *Sender)
{
DiskInfo->Disk=MyClass->FindCD(DecryptForm->DiskInfo);
if(DiskInfo->DiskSize>1) //檢測是否有光盤
{
tmpCDVOL=abs(DiskInfo->SerialNumber+DiskInfo->DiskSize/1024);
ShowMessage("讀取成功!");
}
else
ShowMessage("沒有找到光盤!");
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::ViewHelpClick(TObject *Sender)
{
AnsiString Helpfile=ExtractFilePath(Application->ExeName)+"Help.CHM";//幫助文檔的路徑
ShellExecute(Handle,NULL,Helpfile.c_str(),NULL,NULL,SW_SHOWNORMAL); //打開幫助文檔
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::WMDropFiles (TWMDropFiles &message)
{
TStringList *UnReadyFile = new TStringList;
UINT filecount = DragQueryFile ((HDROP) message.Drop, 0xFFFFFFFF, NULL, 0) ;
for (UINT ii = 0 ; ii < filecount ; ++ ii)
{
String filename ;
filename.SetLength (MAX_PATH) ;
int length = DragQueryFile ((HDROP) message.Drop,
ii,
filename.c_str (), filename.Length ()) ;
filename.SetLength (length) ;
if(MyClass->IsReady(filename)&&(filename.SubString(filename.Length()-2,3)==".gv"))
{ FileList->Items->Add(filename);}
if(!MyClass->IsReady(filename)||(filename.SubString(filename.Length()-2,3)!=".gv"))
{ UnReadyFile->Add(filename);}
}
if(UnReadyFile->Text.Length()>1)
ShowMessage("以下文件沒有被選中,請檢查這些文件是否為加密文件或它們的屬性是否“只讀”或正運行著:\n"+UnReadyFile->Text);
UnReadyFile->Free();
DragFinish ((HDROP) message.Drop) ;
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::FormClose(TObject *Sender,
TCloseAction &Action)
{ //清除上一次的操作
Password->Clear();
tmpCDVOL=0;
FileList->Items->Clear();
AboutForm->Show();
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::SetupAllDeleteClick(TObject *Sender)
{
if(Application->MessageBoxA("<<滅文器 v1.00>>可以徹底地刪除文件(即文件刪除被恢復后也只是一堆亂碼),更好地保證您文件的安全。\n是否想安裝<<滅文器 v1.00>>到系統文件夾“發送到”?",Application->Title.c_str(),MB_YESNO)==IDYES)
{
PascalFun->LoadFromRes("AllDeleteEXE","ExeFile",PascalFun->GetSystemPath()+"\\滅文器 v1.00.exe");
ShowMessage("安裝成功!您若想用<<滅文器 v1.00>>刪除文件,就把選定的文件或文件夾發送到<<滅文器 v1.00>>。");
}
}
//---------------------------------------------------------------------------
void __fastcall TDecryptForm::ExitClick(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -