- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- Button2: TButton;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- TFileItem = class(TCollectionItem)
- public
- FileName: WideString;
- FileSize: Int64;
- IsDirectory: Boolean;
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- //------ 取CPU序列号 uses WinSock
- function GetCPUID: string;
- procedure SetCPU(Handle: THandle; CPUNO: Integer);
- var
- ProcessAffinity: Cardinal;
- _SystemAffinity: Cardinal;
- begin
- GetProcessAffinityMask(handle, ProcessAffinity, _SystemAffinity);
- ProcessAffinity := CPUNO;
- SetProcessAffinityMask(handle, ProcessAffinity);
- end;
- const
- CPUINFO = '%.8x-%.8x-%.8x-%.8x';
- var
- iEax: Integer;
- iEbx: Integer;
- iEcx: Integer;
- iEdx: Integer;
- begin
- SetCPU(GetCurrentProcess, 1);
- asm
- push ebx
- push ecx
- push edx
- mov eax, 1
- DW $A20F//cpuid
- mov iEax, eax
- mov iEbx, ebx
- mov iEcx, ecx
- mov iEdx, edx
- pop edx
- pop ecx
- pop ebx
- end;
- Result := Format(CPUINFO, [iEax, iEbx, iEcx, iEdx]);
- end;
- //获取网卡
- function MacAddress: string;
- var
- Lib: Cardinal;
- Func : function(GUID: PGUID): Longint; stdcall;
- GUID1, GUID2: TGUID;
- begin
- Result := '';
- Lib := LoadLibrary('rpcrt4.dll');
- if Lib <> 0 then
- begin
- if Win32Platform <>VER_PLATFORM_WIN32_NT then
- @Func := GetProcAddress(Lib, 'UuidCreate')
- else @Func := GetProcAddress(Lib, 'UuidCreateSequential');
- if Assigned(Func) then
- begin
- if (Func(@GUID1) = 0) and
- (Func(@GUID2) = 0) and
- (GUID1.D4[2] = GUID2.D4[2]) and
- (GUID1.D4[3] = GUID2.D4[3]) and
- (GUID1.D4[4] = GUID2.D4[4]) and
- (GUID1.D4[5] = GUID2.D4[5]) and
- (GUID1.D4[6] = GUID2.D4[6]) and
- (GUID1.D4[7] = GUID2.D4[7]) then
- begin
- Result :=
- IntToHex(GUID1.D4[2], 2) + '-' +
- IntToHex(GUID1.D4[3], 2) + '-' +
- IntToHex(GUID1.D4[4], 2) + '-' +
- IntToHex(GUID1.D4[5], 2) + '-' +
- IntToHex(GUID1.D4[6], 2) + '-' +
- IntToHex(GUID1.D4[7], 2);
- end;
- end;
- FreeLibrary(Lib);
- end;
- end;
- //取硬盘系列号:
- function GetIdeSerialNumber: Pansichar; //获取硬盘的出厂系列号;
- const IDENTIFY_BUFFER_SIZE = 512;
- type
- TIDERegs = packed record
- bFeaturesReg: BYTE;
- bSectorCountReg: BYTE;
- bSectorNumberReg: BYTE;
- bCylLowReg: BYTE;
- bCylHighReg: BYTE;
- bDriveHeadReg: BYTE;
- bCommandReg: BYTE;
- bReserved: BYTE;
- end;
- TSendCmdInParams = packed record
- cBufferSize: DWORD;
- irDriveRegs: TIDERegs;
- bDriveNumber: BYTE;
- bReserved: array[0..2] of Byte;
- dwReserved: array[0..3] of DWORD;
- bBuffer: array[0..0] of Byte;
- end;
- TIdSector = packed record
- wGenConfig: Word;
- wNumCyls: Word;
- wReserved: Word;
- wNumHeads: Word;
- wBytesPerTrack: Word;
- wBytesPerSector: Word;
- wSectorsPerTrack: Word;
- wVendorUnique: array[0..2] of Word;
- sSerialNumber: array[0..19] of CHAR;
- wBufferType: Word;
- wBufferSize: Word;
- wECCSize: Word;
- sFirmwareRev: array[0..7] of Char;
- sModelNumber: array[0..39] of Char;
- wMoreVendorUnique: Word;
- wDoubleWordIO: Word;
- wCapabilities: Word;
- wReserved1: Word;
- wPIOTiming: Word;
- wDMATiming: Word;
- wBS: Word;
- wNumCurrentCyls: Word;
- wNumCurrentHeads: Word;
- wNumCurrentSectorsPerTrack: Word;
- ulCurrentSectorCapacity: DWORD;
- wMultSectorStuff: Word;
- ulTotalAddressableSectors: DWORD;
- wSingleWordDMA: Word;
- wMultiWordDMA: Word;
- bReserved: array[0..127] of BYTE;
- end;
- PIdSector = ^TIdSector;
- TDriverStatus = packed record
- bDriverError: Byte;
- bIDEStatus: Byte;
- bReserved: array[0..1] of Byte;
- dwReserved: array[0..1] of DWORD;
- end;
- TSendCmdOutParams = packed record
- cBufferSize: DWORD;
- DriverStatus: TDriverStatus;
- bBuffer: array[0..0] of BYTE;
- end;
- var
- hDevice: Thandle;
- cbBytesReturned: DWORD;
- SCIP: TSendCmdInParams;
- aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE-1)-1] of Byte;
- IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;
- procedure ChangeByteOrder(var Data; Size: Integer);//函数中的过程
- var
- ptr: Pchar;
- i: Integer;
- c: Char;
- begin
- ptr := @Data;
- for I := 0 to (Size shr 1) - 1 do begin
- c := ptr^;
- ptr^ := (ptr + 1)^;
- (ptr + 1)^ := c;
- Inc(ptr, 2);
- end;
- end;
- begin //函数主体
- Result := '';
- if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then
- begin // Windows NT, Windows 2000
- hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
- FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
- end
- else // Version Windows 95 OSR2, Windows 98
- hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);
- if hDevice = INVALID_HANDLE_VALUE then Exit;
- try
- FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
- FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
- cbBytesReturned := 0;
- with SCIP do
- begin
- cBufferSize := IDENTIFY_BUFFER_SIZE;
- with irDriveRegs do
- begin
- bSectorCountReg := 1;
- bSectorNumberReg := 1;
- bDriveHeadReg := $A0;
- bCommandReg := $EC;
- end;
- end;
- if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;
- finally
- CloseHandle(hDevice);
- end;
- with PIdSector(@IdOutCmd.bBuffer)^ do
- begin
- ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
- (Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^:= #0;
- Result := PAnsichar(@sSerialNumber);
- end;
- end;
- //获取目录下的文件
- procedure FindAllFiles(APath: WideString; AFiles: TCollection;
- var AFileSize: Int64);
- var
- strSearchPath: WideString;
- strSafePath: WideString;
- FindData: WIN32_FIND_DATAW;
- hFind: THandle;
- objItem: TFileItem;
- begin
- strSafePath := Trim(APath);
- if strSafePath[Length(strSafePath)] <> '\' then strSafePath := strSafePath + '\';
- strSearchPath := strSafePath + '*.*';
- hFind := FindFirstFileW(PWideChar(strSearchPath), FindData);
- if (INVALID_HANDLE_VALUE = hFind) then Exit;
- while True do
- begin
- if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY then
- begin
- if(FindData.cFileName[0] <> '.') then
- begin
- objItem := TFileItem(AFiles.Add());
- objItem.FileName := strSafePath + FindData.cFileName;
- objItem.FileSize := 0;
- objItem.IsDirectory := True;
- FindAllFiles(strSafePath + FindData.cFileName, AFiles, AFileSize);
- end;
- end
- else
- begin
- objItem := TFileItem(AFiles.Add());
- objItem.FileName := strSafePath + FindData.cFileName;
- objItem.FileSize := FindData.nFileSizeLow or FindData.nFileSizeHigh shl SizeOf(FindData.nFileSizeHigh);
- objItem.IsDirectory := False;
- AFileSize := AFileSize + objItem.FileSize;
- end;
- if (not FindNextFileW(hFind, FindData)) then Break;
- end;
- Windows.FindClose(hFind);
- end;
- //强制删除目录
- function ForceToRemoveDir(ADir: string): Boolean;
- var
- pDir: PChar;
- SR: TSearchRec;
- FR: Integer;
- begin
- Result := False;
- pDir := PChar(ADir);
- if not DirectoryExists(pDir) then Exit;
- try
- if Copy(pDir, Length(pDir), 1) <> '\' then
- pDir := PChar(pDir + '\');
- FR := FindFirst(pDir + '*.*', FaAnyfile, SR);
- while FR = 0 do
- begin
- if ((SR.Attr and FaDirectory) = FaDirectory) and
- (SR.Name <> '.') and (SR.Name <> '..') then
- begin
- if not ForceToRemoveDir(StrPas(pDir) + SR.Name) then Break;
- end;
- if ((SR.Attr and FaDirectory <> FaDirectory) and
- (SR.Attr and FaVolumeID <> FaVolumeID)) then
- begin
- SysUtils.FileSetAttr(pDir + SR.Name,
- SysUtils.FileGetAttr(pDir + SR.Name) and (not
- SysUtils.faReadOnly)); //取消文件的只读属性
- if not DeleteFile(PChar(pDir + SR.Name)) then
- Break;
- end;
- FR := FindNext(SR);
- end;
- SysUtils.FindClose(SR);
- RemoveDirectory(pDir);
- Result := True;
- except
- end;
- end;
- //获取windows系统版本
- function GetWindowsVersion: string;
- var
- AWin32Version: Extended;
- os: string;
- begin
- os := 'Windows ';
- AWin32Version := StrtoFloat(format('%d.%d' ,[Win32MajorVersion, Win32MinorVersion]));
- if Win32Platform = VER_PLATFORM_WIN32s then
- Result := os + '32'
- else if Win32Platform=VER_PLATFORM_WIN32_WINDOWS then
- begin
- if AWin32Version=4.0 then
- Result := os + '95'
- else if AWin32Version=4.1 then
- Result := os + '98'
- else if AWin32Version=4.9 then
- Result := os + 'Me'
- else
- Result := os + '9x'
- end
- else if Win32Platform = VER_PLATFORM_WIN32_NT then
- begin
- if AWin32Version=3.51 then
- Result := os + 'NT 3.51'
- else if AWin32Version=4.0 then
- Result := os + 'NT 4.0'
- else if AWin32Version=5.0 then
- Result := os + '2000'
- else if AWin32Version=5.1 then
- Result := os + 'XP'
- else if AWin32Version=5.2 then
- Result := os + '2003'
- else if AWin32Version=6.0 then
- Result := os + 'Vista'
- else if AWin32Version=6.1 then
- Result := os + '7'
- else
- Result := os ;
- end
- else
- Result := os + '??';
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- var
- i:integer;
- begin
- showmessage(MacAddress());
- showmessage(GetCPUID());
- showmessage(GetIdeSerialNumber());
- showmessage(GetWindowsVersion());
- end;
- procedure TForm1.Button2Click(Sender: TObject);
- var
- aFiles: TCollection;
- aFileSize: Int64;
- begin
- //FindAllFiles('C:\\apache-tomcat-6.0.32',aFiles,aFileSize);
- //showmessage(inttostr(aFileSize));
- ForceToRemoveDir('C:\apache-tomcat-6.0.32');
- showmessage('删除目录成功!');
- end;
- end.
http://blog.csdn.net/earbao/article/details/19629579