?? unitpublicfunction.pas
字號:
lpnLength:DWORD;
begin
Result :='';
lpnLength := 0;
WNetGetUser(Nil,Nil,lpnLength);
if lpnLength>0 then
begin
GetMem(lpUserName,lpnLength);
if WNetGetUser(lpName,lpUserName,lpnLength)=NO_ERROR then
Result := lpUserName;
FreeMem(lpUserName,lpnLength);
end;
end;
function HideAppTask:Boolean;//使程序不出現在任務欄
begin
try
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
result := True;
except
result := False;
end;
end;
function SetComputerName(name:string):Boolean;//改變計算機在網絡中的名字
begin
try
SetComputerName(PChar(name));
result := True;
except
result := False;
end;
end;
function GetSysPath:string;//獲取WINDOWS系統路徑
var
MySysPath : PChar;
begin
GetMem(MySysPath,255);
GetSystemDirectory(MySysPath,255);
Result := MySysPath;
end;
function GetSysInfo:string;//獲取WINDOWS版本信息
var
s : AnsiString;
OSVI : OSVERSIONINFO;
begin
OSVI.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
GetVersionEx(OSVI);
s := IntToStr(OSVI.dwMajorVersion)+'.'+IntToStr(OSVI.dwMinorVersion)
+'.'+IntToStr(OSVI.dwBuildNumber)+'.'+IntToStr(OSVI.dwPlatformId)
+OSVI.szCSDVersion;
Result := s;
end;
function IsEqualsTStrs(A,B:TStrings):Boolean;//比較兩個TStrings
var
i : integer;
function SearchTStrs(tmpstr:string;sourceTStrs:TStrings):Boolean;
var
j : integer;
begin
Result := False;
for j:=0 to sourceTStrs.Count-1 do
begin
if tmpstr=sourceTStrs.Strings[j] then
begin
Result := True;
Break;
end;
end;
end;
begin
Result := True;
if A.Count<>B.Count then
begin
Result := False;
Exit;
end;
for i:=0 to A.Count-1 do
begin
if not SearchTStrs(A.Strings[i],B) then
begin
Result := False;
Break;
end;
end;
end;
function IsDate(tmp:string):Boolean;//判斷是否為合法日期
var
s : string;
begin
Result := True;
if tmp<>'' then
begin
if length(tmp)<>8 then
begin
Result := False;
Exit;
end;
try
s := copy(tmp,1,4)+'-'+copy(tmp,5,2)+'-'+copy(tmp,7,2);
StrToDate(s);
except
Result := False;
end;
end;
end;
function CopyDir(fromdir,todir:string):Boolean;
var
OPStruc : TSHFileOpStruct;
frombuf,tobuf : array [0..128] of Char;
begin
try
Result := False;
FillChar(frombuf,sizeof(frombuf),0);
FillChar(tobuf,sizeof(tobuf),0);
if copy(fromdir,length(fromdir),1)='\' then
StrPCopy(frombuf,fromdir+'\*.*')
else
StrPCopy(frombuf,fromdir);
StrPCopy(tobuf,todir);
with OpStruc do
begin
Wnd := Application.Handle;
wFunc := FO_COPY;
pFrom := @frombuf;
pTo := @tobuf;
fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
fAnyOperationsAborted := False;
hNameMappings := Nil;
lpszProgressTitle := Nil;
end;
ShFileOperation(OpStruc);
Result := True;
except
Result := False;
end;
end;
function GetIdeSerialNumber: PChar;//獲取第一個IDE硬盤的序列號
const
IDENTIFY_BUFFER_SIZE = 512;
type
TIDERegs = packed record
bFeaturesReg : BYTE; // Used for specifying SMART "commands".
bSectorCountReg : BYTE; // IDE sector count register
bSectorNumberReg : BYTE; // IDE sector number register
bCylLowReg : BYTE; // IDE low order cylinder value
bCylHighReg : BYTE; // IDE high order cylinder value
bDriveHeadReg : BYTE; // IDE drive/head register
bCommandReg : BYTE; // Actual IDE command.
bReserved : BYTE; // reserved for future use. Must be zero.
end;
TSendCmdInParams = packed record
// Buffer size in bytes
cBufferSize : DWORD;
// Structure with drive register values.
irDriveRegs : TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber : BYTE;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte; // Input buffer.
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
// 驅動器返回的錯誤代碼,無錯則返回0
bDriverError : Byte;
// IDE出錯寄存器的內容,只有當bDriverError 為 SMART_IDE_ERROR 時有效
bIDEStatus : Byte;
bReserved : Array[0..1] of Byte;
dwReserved : Array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
// bBuffer的大小
cBufferSize : DWORD;
// 驅動器狀態
DriverStatus : TDriverStatus;
// 用于保存從驅動器讀出的數據的緩沖區,實際長度由cBufferSize決定
bBuffer : Array[0..0] of BYTE;
end;
var
hDevice : THandle;
cbBytesReturned : DWORD;
ptr : PChar;
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// Windows NT, Windows 2000
begin
// 提示! 改變名稱可適用于其它驅動器,如第二個驅動器: '\\.\PhysicalDrive1\'
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
begin
hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
end;
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0);
FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0);
cbBytesReturned := 0;
// Set up data structures for IDENTIFY command.
with SCIP do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
// bDriveNumber := 0;
with irDriveRegs do
begin
bSectorCountReg := 1;
bSectorNumberReg := 1;
// if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
// else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
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 := PChar(@sSerialNumber);
end;
end;
function GetGUID:String;
var
TmpGUID: TGUID;
begin
Result := 'error';
if CoCreateGUID(TmpGUID) = S_OK then
Result := GUIDToString(TmpGUID);
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -