?? unitmain.~pas
字號:
unit unitMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Registry, StdCtrls;
Const
//下面常量以創(chuàng)建文件時的path、name和size為準,聲明常量只為演示
cvdFileName:String='111.cvd';
bakFileName:String='111.cvdbak';
LocalDiskName:String='d:\';
MountPoint:String='e:\test\';
type
TfrmMain = class(TForm)
GroupBox1: TGroupBox;
btnSetup: TButton;
GroupBox2: TGroupBox;
btnPowerOn: TButton;
GroupBox3: TGroupBox;
btnCreateFile: TButton;
btnDeleteFile: TButton;
btnMountDisk: TButton;
btnUmountDisk: TButton;
btnProtectDisk: TButton;
btnUprotectDisk: TButton;
procedure btnCreateFileClick(Sender: TObject);
procedure btnSetupClick(Sender: TObject);
procedure btnPowerOnClick(Sender: TObject);
procedure btnDeleteFileClick(Sender: TObject);
procedure btnMountDiskClick(Sender: TObject);
procedure btnUmountDiskClick(Sender: TObject);
procedure btnProtectDiskClick(Sender: TObject);
procedure btnUprotectDiskClick(Sender: TObject);
private
{ Private declarations }
public
end;
Function EplDriveDisk(strParameter:String):integer;stdcall;external 'epldrive.dll';
Function mksparse(strFilePath,strFileSize:String):integer;stdcall;external 'mksparse.dll';
Function GetVolume(strVolumeMountPoint, strVolumeName:String; intBufferLength:Longword):integer; stdcall; external 'DiskVolume.dll';
Function DeleteVolume(strVolumeMountPoint:String):integer;stdcall;external 'DiskVolume.dll';
Function SetVolume(strVolumeMountPoint,strVolumeName:String):integer;stdcall;external 'DiskVolume.dll';
Function GetCvdFileSize():String;
Function GetVolumeName():String;
var
frmMain: TfrmMain;
implementation
uses unitCreateFile;
{$R *.dfm}
procedure TfrmMain.btnSetupClick(Sender: TObject);
var
bufVolumeName:String;
rc:integer;
Reg:TRegistry;
begin
//獲取D分區(qū)的VolumeName
SetLength(bufVolumeName,1024);
rc:=GetVolume(LocalDiskName,bufVolumeName,1024);
if rc<>0 then
begin
ShowMessage('GetVolume失敗');
exit;
end;
//把VolumeName寫入注冊表
Reg:=Tregistry.Create;
try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\Software\E-Play',True) then
Reg.WriteString('VolumeName',bufVolumeName);
Finally
Reg.CloseKey;
Reg.Free;
end;
//隱藏盤符
rc:=DeleteVolume(LocalDiskName);
if rc<>0 then
begin
ShowMessage('隱藏D分區(qū)失敗,程序退出');
exit;
end;
//生成磁盤加載點
rc:=SetVolume(MountPoint,bufVolumeName);
if rc<>0 then
begin
ShowMessage('生成加載點失敗,程序退出');
exit;
end;
//隱藏加載點
rc:=DeleteVolume(MountPoint);
if rc<>0 then
begin
ShowMessage('隱藏加載點失敗,程序退出');
exit;
end;
//以下代碼與調(diào)用無關(guān),僅為示例的正常運行
SetVolume(LocalDiskName,bufVolumeName);
ShowMessage('成功');
end;
procedure TfrmMain.btnPowerOnClick(Sender: TObject);
var
VolumeName:String;
rc:integer;
strTemp:String;
cvdFileSize:String;
begin
//該段代碼與調(diào)用無關(guān),僅為示例可以正常運行
DeleteVolume(LocalDiskName);
//以下代碼有效
//從注冊表獲取VolumeName
VolumeName:=GetVolumeName();
//從注冊表獲取cvdFileSize
cvdFileSize:=GetCvdFileSize();
//由VolumeName生成加載點
rc:=SetVolume(MountPoint,VolumeName);
if rc<>0 then
begin
ShowMessage('生成加載點失敗,程序退出');
exit;
end;
//刪除bak文件
if not DeleteFile(MountPoint+bakFileName) then
begin
ShowMessage('刪除bak文件失敗,程序退出');
exit;
end;
//開機創(chuàng)建bak文件
rc:=mksparse(MountPoint+bakFileName,'1M');
if rc<>0 then
begin
ShowMessage('創(chuàng)建bak文件失敗,程序退出');
exit;
end;
//加載虛擬盤
strTemp:='/mount 0 ' + MountPoint+cvdFilename + ' ' + cvdFileSize + ' ' + 'd:';
rc:=EplDriveDisk(strTemp);
if rc<>0 then
begin
ShowMessage('加載虛擬D失敗');
exit;
end;
//隱藏加載點
rc:=DeleteVolume(MountPoint);
if rc<>0 then
begin
ShowMessage('隱藏加載點失敗');
exit;
end;
ShowMessage('成功');
end;
procedure TfrmMain.btnCreateFileClick(Sender: TObject);
begin
frmCreateFile.show;
end;
procedure TfrmMain.btnDeleteFileClick(Sender: TObject);
begin
if not DeleteFile(LocalDiskName+cvdFileName) then
begin
ShowMessage('刪除cvd文件失敗,請檢查文件是否存在或者是否被占用中');
exit;
end;
if not DeleteFile(LocalDiskName+bakFileName) then
begin
ShowMessage('刪除bak文件失敗,請檢查文件是否存在或者是否被占用中');
exit;
end;
ShowMessage('刪除成功');
end;
procedure TfrmMain.btnMountDiskClick(Sender: TObject);
var
VolumeName:String;
strTemp:String;
rc:integer;
cvdFileSize:String;
begin
//從注冊表獲取VolumeName
VolumeName:=GetVolumeName();
//從注冊表獲取cvdFileSize
cvdFileSize:=GetCvdFileSize();
//隱藏物理分區(qū)
rc:=DeleteVolume(LocalDiskName);
if rc<>0 then
begin
ShowMessage('隱藏D分區(qū)失敗,程序退出');
exit;
end;
//生成加載點
ShowMessage(MountPoint);
rc:=SetVolume(MountPoint,VolumeName);
if rc<>0 then
begin
ShowMessage('生成加載點失敗,程序退出');
exit;
end;
//加載虛擬盤
strTemp:='/mount 0 ' + MountPoint + cvdFileName + ' ' + cvdFileSize + ' ' + LocalDiskName;
rc:=EplDriveDisk(strTemp);
if rc<>0 then
begin
ShowMessage('生成虛擬盤失敗');
exit;
end;
//隱藏加載點
rc:=DeleteVolume(MountPoint);
if rc<>0 then
begin
ShowMessage('隱藏加載點失敗');
exit;
end;
ShowMessage('成功');
end;
procedure TfrmMain.btnUmountDiskClick(Sender: TObject);
var
VolumeName:String;
rc:integer;
strTemp:string;
begin
//從注冊表里獲取VolumeName
VolumeName:=GetVolumeName();
strTemp:='/umount ' + LocalDiskName;
rc:=EplDriveDisk(strTemp);
if rc<>0 then
begin
ShowMessage('卸載虛擬盤失敗');
exit;
end;
//還原物理分區(qū)
rc:=SetVolume(LocalDiskName,VolumeName);
if rc<>0 then
begin
ShowMessage('生成D盤失敗');
exit;
end;
ShowMessage('成功');
end;
procedure TfrmMain.btnProtectDiskClick(Sender: TObject);
var
VolumeName:String;
rc:integer;
strTemp:String;
cvdFileSize:String;
begin
//從注冊表獲取VolumeName
VolumeName:=GetVolumeName();
//從注冊表獲取cvdFileSize
cvdFileSize:=GetCvdFileSize();
//卸載虛擬分區(qū)
strTemp:='/umount ' + LocalDiskName;
rc:=EplDriveDisk(strTemp);
if rc<>0 then
begin
ShowMessage('卸載虛擬分區(qū)失敗');
exit;
end;
//生成加載點
rc:=SetVolume(MountPoint,VolumeName);
if rc<>0 then
begin
ShowMessage('生成加載點失敗');
exit;
end;
//加載虛擬分區(qū)
strTemp:='/mount 0 ' + MountPoint + cvdFileName + ' ' + cvdFileSize + ' ' + LocalDiskName;
rc:=EplDriveDisk(strTemp);
if rc<>0 then
begin
ShowMessage('加載D盤失敗');
exit;
end;
//設(shè)置磁盤為保護狀態(tài)
rc:=EplDriveDisk('/setflag d: 1');
if rc<>0 then
begin
ShowMessage('設(shè)置D盤保護狀態(tài)失敗');
exit;
end;
//隱藏加載點
rc:=DeleteVolume(MountPoint);
if rc<>0 then
begin
ShowMessage('刪除加載點失敗');
exit;
end;
ShowMessage('成功');
end;
procedure TfrmMain.btnUprotectDiskClick(Sender: TObject);
var
VolumeName:String;
rc:integer;
strTemp:String;
cvdFileSize:String;
begin
//從注冊表獲取VolumeName
VolumeName:=GetVolumeName();
//從注冊表獲取cvdFileSize
cvdFileSize:=GetCvdFileSize();
//卸載虛擬盤
strTemp:='/umount ' + LocalDiskName;
rc:=EplDriveDisk(strTemp);
if rc<>0 then
begin
ShowMessage('卸載D盤失敗');
exit;
end;
//生成加載點
rc:=SetVolume(MountPoint,VolumeName);
if rc<>0 then
begin
ShowMessage('生成加載點失敗');
exit;
end;
//加載虛擬盤
strTemp:='/mount 0 ' + MountPoint + cvdFileName + ' ' + cvdFileSize + ' ' + 'd:';
rc:=EplDriveDisk(strTemp);
if rc<>0 then
begin
ShowMessage('加載虛擬盤失敗');
exit;
end;
//設(shè)置虛擬盤為非保護狀態(tài)
rc:=EplDriveDisk('/setflag d: 0');
if rc<>0 then
begin
ShowMessage('設(shè)置D盤非保護狀態(tài)失敗');
exit;
end;
//隱藏加載點
rc:=DeleteVolume(MountPoint);
if rc<>0 then
begin
ShowMessage('刪除加載點失敗');
exit;
end;
ShowMessage('成功');
end;
Function GetVolumeName():String;
var
Reg:TRegistry;
VolumeName:String;
begin
Reg:=TRegistry.Create;
try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if not Reg.KeyExists('\Software\E-Play') then
begin
ShowMessage('讀取注冊表失敗,鍵值不存在');
exit;
end
else
begin
Reg.OpenKey('\Software\E-Play',False);
if not Reg.ValueExists('VolumeName') then
begin
ShowMessage('鍵值不存在');
exit;
end
else
begin
VolumeName:=Reg.ReadString('VolumeName');
if VolumeName='' then
begin
ShowMessage('VolumeName為空');
exit;
end;
end;
end;
finally
Reg.CloseKey;
Reg.Free;
end;
result:=VolumeName;
end;
Function GetCvdFileSize():String;
var
Reg:TRegistry;
cvdFileSize:String;
begin
Reg:=TRegistry.Create;
try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if not Reg.KeyExists('\Software\E-Play') then
begin
ShowMessage('讀取注冊表失敗,鍵值不存在');
exit;
end
else
begin
Reg.OpenKey('\Software\E-Play',False);
if not Reg.ValueExists('cvdFileSize') then
begin
ShowMessage('鍵值不存在');
exit;
end
else
begin
cvdFileSize:=Reg.ReadString('cvdFileSize');
if cvdFileSize='' then
begin
ShowMessage('cvdFileSize為空');
exit;
end;
end;
end;
finally
Reg.CloseKey;
Reg.Free;
end;
result:=cvdFileSize;
end;
end.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -