?? myclassfile.cpp
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MyClassFile.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
TPascalFun *PascalFun; //引用Delphi函數的類
TForm *MessageForm =new TForm(Application);
//---------------------------------------------------------------------------
AnsiString __fastcall TMyClass::EncryptFile(AnsiString FileName,AnsiString FileExt,AnsiString Password,int ST,int ET,unsigned long BanMove,unsigned long CDVOL)
{
//加密文件
try{
Password=Password+String(BanMove)+String(CDVOL);
int *PWD= new int[Password.Length()];
for(int i=1;i<Password.Length();i++)
{
PWD[i]=int(Password[i]);
}
int filehandle,ii=2;
unsigned long filelength;
unsigned char * pszBufferA;
filehandle=FileOpen(FileName,fmOpenReadWrite);
filelength=FileSeek(filehandle,0,2);
FileSeek(filehandle,0,0);
pszBufferA=new char [filelength+13];
FileRead(filehandle,pszBufferA,filelength);
FileSeek(filehandle,0,0);
//IamGV是成功解密的標志
pszBufferA[filelength]='H';
pszBufferA[filelength+1]='i';
pszBufferA[filelength+2]='!';
pszBufferA[filelength+3]='G';
pszBufferA[filelength+4]='V';
pszBufferA[filelength+5]=' ';
pszBufferA[filelength+6]='H';
pszBufferA[filelength+7]='i';
pszBufferA[filelength+8]='!';
pszBufferA[filelength+9]='C';
pszBufferA[filelength+10]='O';
pszBufferA[filelength+11]='C';
pszBufferA[filelength+12]='O';
for(int i=0;i<filelength+12;i++)
{
pszBufferA[i]=pszBufferA[i]-PWD[ii]-PWD[ii-1]+PWD[ii+1]-PWD[ii+2]+PWD[ii+3];
ii++;
if(ii+3>=Password.Length())
ii=2;
}
FileWrite(filehandle,pszBufferA,filelength+13);
FileClose(filehandle);
delete []pszBufferA;
RenameFile(FileName,FileName+FileExt);
//-------------------------往文件尾部寫信息,解密時用作根據
unsigned char * pszBufferB;
filehandle=FileOpen(FileName+FileExt,fmOpenReadWrite);
filelength=FileSeek(filehandle,0,2);
FileSeek(filehandle,0,0);
pszBufferB=new char [filelength+5];
FileRead(filehandle,pszBufferB,filelength);
FileSeek(filehandle,0,0);
pszBufferB[filelength+1]=ST+11;
pszBufferB[filelength+2]=ET+12;
if(BanMove==19851120) //不使用BanMove,BanMove=19851120
pszBufferB[filelength+3]=197;//197為不使用的標志
if(BanMove!=19851120) //使用BanMove,BanMove!=19851120
pszBufferB[filelength+3]=157;//157為使用BanMove的標志
if(CDVOL==19860308) //不使用CDVOL,CDVOL=19860308
pszBufferB[filelength+4]=197;//197為不使用的標志
if(CDVOL!=19860308) //使用CDVOL,CDVOL!=19860308
pszBufferB[filelength+4]=38;//38為使用CDVOL的標志
FileWrite(filehandle,pszBufferB,filelength+5);
FileClose(filehandle);
delete []pszBufferB;
return FileName+FileExt;
}
catch ( ... )
{ return ""; }
}
//---------------------------------------------------------------------------
bool __fastcall TMyClass::DecryptFile(AnsiString FileName,AnsiString Password,unsigned long BanMove,unsigned long CDVOL,int DelExt)
{
//解密文件
try{
int filehandle;
unsigned long filelength;
unsigned char * pszBuffer;
filehandle=FileOpen(FileName,fmOpenReadWrite);
filelength=FileSeek(filehandle,0,2);
FileSeek(filehandle,0,0);
pszBuffer=new char [filelength-5];
FileRead(filehandle,pszBuffer,filelength-5);
Password=Password+String(BanMove)+String(CDVOL);
int *PWD= new int[Password.Length()];
for(int i=1;i<Password.Length();i++)
{
PWD[i]=int(Password[i]);
}
int ii=2;
for(int i=0;i<filelength-5;i++)
{
pszBuffer[i]=pszBuffer[i]+PWD[ii]+PWD[ii-1]-PWD[ii+1]+PWD[ii+2]-PWD[ii+3];
ii++;
if(ii+3>=Password.Length())
ii=2;
}//Hi!GV Hi!COCO是成功解密的標志
if(pszBuffer[filelength-7]=='C'&&pszBuffer[filelength-8]=='O'&&pszBuffer[filelength-9]=='C'&&pszBuffer[filelength-10]=='!'&&pszBuffer[filelength-11]=='i'&&pszBuffer[filelength-12]=='H'&&pszBuffer[filelength-13]==' '&&pszBuffer[filelength-14]=='V'&&pszBuffer[filelength-15]=='G'&&pszBuffer[filelength-16]=='!'&&pszBuffer[filelength-17]=='i'&&pszBuffer[filelength-18]=='H')
{
FileClose(filehandle);
PascalFun->WipeFile(FileName);
_lclose(_lcreat(PascalFun->MypChar(FileName),0));
int filehandleB=FileOpen(FileName,fmOpenReadWrite);
FileSeek(filehandleB,0,0);
FileWrite(filehandleB,pszBuffer,filelength-18);
FileClose(filehandleB);
delete []pszBuffer;
RenameFile(FileName,FileName.SubString(0,FileName.Length()-DelExt));
return true;
}
else
{
FileClose(filehandle);
delete []pszBuffer;
return false; }}
catch ( ... )
{ return false; }
}
//---------------------------------------------------------------------------
char __fastcall TMyClass::FindCD(TDiskInfo *DiskInfo)
{
int CDR=0;
char *Disks[23]={"D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
for(int i=0;i<23;i++)
{
DiskInfo->Disk=*Disks[i];
if(DiskInfo->DriveType==Diskinfo::dtCDROM)
CDR++;
}
if(CDR==1)
{
for(int i=0;i<23;i++)
{
DiskInfo->Disk=*Disks[i];
if(DiskInfo->DriveType==Diskinfo::dtCDROM)
return *Disks[i];
}
}
if(CDR>1)
{ //取得輸入的盤符
inputagain: char cddrive=*(InputBox("請輸入密鑰光盤所在光驅的盤符(例如:Z)","","Z").c_str());
DiskInfo->Disk=cddrive;
if(DiskInfo->DriveType!=Diskinfo::dtCDROM)//如果不是光驅
{
ShowMessage("您輸入的不是光驅的盤符!請重新輸入");
goto inputagain;
}
if(DiskInfo->DriveType==Diskinfo::dtCDROM)//如果是光驅 ,返回
return cddrive;
}
}
//---------------------------------------------------------------------------
long __fastcall TMyClass::GetBanMove(TDiskInfo *DiskInfo,AnsiString FileName)
{//用文件的時間屬性來加密,防止文件被復制、修改
FILETIME *creation=new FILETIME;
FILETIME *lastaccess=new FILETIME;
FILETIME *lastwrite=new FILETIME;
HFILE hfile;
hfile=_lopen(PascalFun->MypChar(FileName),OF_READ);
GetFileTime((HANDLE *)hfile,creation,lastaccess,lastwrite);
_lclose(hfile);
DiskInfo->Disk=*ExtractFileDrive(FileName).c_str();
return sqrt(creation->dwLowDateTime-creation->dwHighDateTime+lastwrite->dwLowDateTime-lastwrite->dwHighDateTime+sqrt(abs(DiskInfo->SerialNumber)));
}
//---------------------------------------------------------------------------
void __fastcall TMyClass::ToPackage(TADOTable *ADOTable,AnsiString FileName)
{ //由于文件名最后要經過處理,所以先保存文件流,再保存經過處理的文件名
ADOTable->Append();
//保存文件流
TFileStream *stream=new TFileStream(FileName,fmOpenRead);
PascalFun->SaveToPackage(ADOTable,stream);//不知為什么,可以用Pascal保存流到數據庫,但c++就不行
stream->Free();
//保存文件名
FileName=ExtractFileName(FileName);//除去路徑名
ADOTable->FieldByName("FileName")->Value=FileName;
ADOTable->Post();
}
//---------------------------------------------------------------------------
void __fastcall TMyClass::Compress(AnsiString FileName)
{ //壓縮并覆蓋
TMemoryStream *target=new TMemoryStream;
TFileStream *source=new TFileStream(FileName,fmOpenRead);
LHACompress(source,target);
source->Free();
target->SaveToFile(FileName);
target->Free();
}
//--------------------------------------------------------------------------
void __fastcall TMyClass::Expand(AnsiString FileName)
{
TMemoryStream *target=new TMemoryStream;
TFileStream *source=new TFileStream(FileName,fmOpenRead);
LHAExpand(source,target);
source->Free();
target->SaveToFile(FileName);
target->Free();
}
//--------------------------------------------------------------------------
void __fastcall TMyClass::ShowMyMessage(AnsiString Caption,AnsiString str)
{
MessageForm->BorderStyle=bsToolWindow;
MessageForm->Position=poDesktopCenter;
MessageForm->Caption=Caption;
MessageForm->Width=250;
MessageForm->Height=77;
MessageForm->Canvas->Font->Size=10;
MessageForm->Canvas->Brush->Style=bsClear;
MessageForm->Show();
MessageForm->Canvas->TextOutA(MessageForm->Width/7,MessageForm->Height/4,str);
}
//--------------------------------------------------------------------------
void __fastcall TMyClass::CloseMyMessage()
{
MessageForm->Close();
}
//--------------------------------------------------------------------------
bool __fastcall TMyClass::IsReady(AnsiString FileName)
{
HFILE hfile;
hfile=_lopen(FileName.c_str(),OF_WRITE);
_lclose(hfile);
if(hfile<0)
return false;
if(hfile>=0)
return true;
}
//--------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -