2 Star 6 Fork 5

吕不为 / dbhelper

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
SQLUtils.pas 23.43 KB
一键复制 编辑 原始数据 按行查看 历史
吕不为 提交于 2017-08-30 09:00 . init
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
unit SQLUtils;
interface
uses Windows, forms, Sysutils, classes, Db, Dialogs, IniFiles;
function BuildSqlFromFmt(const Sql_Fmt: string; aDataSet: TDataSet): string; //根据传进来的 SQL 模板和 数据集 产生 SQL 模板
function BuildInsertFieldSqlFromFmt(const Sql_Fmt: string; aDataSet: TDataSet): string; //根据传进来的 SQL 模板和 数据集 产生 SQL 模板
function RunOK: string;
function GetMacCode: string;
implementation
uses CommDes;
function BlobAsText(Blob: TBlobField): string;
var
Stream: TMemoryStream;
StrStream: TStringStream;
p: Byte;
iSize, j: Integer;
pp: string;
begin
Result := '';
Stream := TMemoryStream.Create;
StrStream := TStringStream.Create('');
try
blob.SaveToStream(stream);
iSize := Stream.Seek(0, soFromEnd);
StrStream.Size := isize * 2;
Stream.Seek(0, soFromBeginning);
for j := 0 to iSize - 1 do
begin
Stream.Read(p, 1);
pp := IntToHex(p, 2);
StrStream.WriteString(pp);
end;
Result := StrStream.DataString;
finally
StrStream.Free;
Stream.Free;
end;
end;
function BuildInsertFieldSqlFromFmt(const Sql_Fmt: string; aDataSet: TDataSet): string; //根据传进来的 SQL 模板和 数据集 产生 SQL 模板
var
i: integer;
Out_Str: string;
Re_FieldName: string;
Field_Value: string;
begin
if Trim(Sql_Fmt) = '' then Exit;
Out_Str := Sql_Fmt;
for i := 0 to aDataSet.FieldDefs.Count - 1 do
begin
case aDataSet.FieldDefs[i].DataType of
ftString, ftFixedChar: //LHQ:2004-03-23
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsString;
if ByteType(Field_Value, Length(Field_Value)) = mbLeadByte then //2010-03-05 LHQ 如果是半具汉字,则去掉.
Field_Value := Copy(Field_Value, 1, Length(Field_Value) - 1);
Field_Value := StringReplace(Field_Value, '''', '''''', [rfReplaceAll]);
//要把\改为\\进行转义
Field_Value := StringReplace(Field_Value, '\', '\\', [rfReplaceAll]);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftSmallInt, ftInteger, ftLargeInt:
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := IntToStr(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsInteger);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
ftBoolean:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsBoolean then
Field_Value := '''1'''
else
Field_Value := '''0''';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftBCD, ftFloat:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := FloatToStr(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsFloat);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftCurrency:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := CurrToStr(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsCurrency);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftDate:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := FormatDateTime('YYYY-MM-DD', aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsDatetime);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftTime:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := FormatDateTime('HH:MM:SS', aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsDateTime);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftDateTime:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := FormatDateTime('YYYY-MM-DD HH:MM:SS', aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsDateTime);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
//LHQ 2008-03-13 在Oracle下, ftLargeInt是整数,不是日期格式 ,因此转到和整数相同的格式下.
// ftLargeInt:
// Field_Value := DateTimeToStr(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsDateTime);
ftBlob:
begin
Field_Value := '0x' + BlobAsText(TBlobField(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name)));
if Field_Value = '0x' then
Field_Value := 'NULL';
end;
ftMemo:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsString;
Field_Value := StringReplace(Field_Value, '''', '''''', [rfReplaceAll]);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
// ftWideMemo:
// begin
// Field_Value := WideCharToString(PWideChar(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsString));
// Field_Value := StringReplace(Field_Value, '''', '''''', [rfReplaceAll]);
// end;
ftWideString:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := Trim(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsString);
Field_Value := StringReplace(Field_Value, '''', '''''', [rfReplaceAll]);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
end;
Result := Out_Str;
end;
end;
function BuildSqlFromFmt(const Sql_Fmt: string; aDataSet: TDataSet): string; //根据传进来的 SQL 模板和 数据集 产生 SQL 模板
var
i: integer;
Out_Str: string;
Re_FieldName: string;
Field_Value: string;
begin
if Trim(Sql_Fmt) = '' then Exit;
Out_Str := Sql_Fmt;
for i := 0 to aDataSet.FieldDefs.Count - 1 do
begin
case aDataSet.FieldDefs[i].DataType of
ftString, ftFixedChar: //LHQ:2004-03-23
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsString;
if ByteType(Field_Value, Length(Field_Value)) = mbLeadByte then //2010-03-05 LHQ 如果是半具汉字,则去掉.
Field_Value := Copy(Field_Value, 1, Length(Field_Value) - 1);
Field_Value := StringReplace(Field_Value, '''', '''''', [rfReplaceAll]);
//要把\改为\\进行转义
Field_Value := StringReplace(Field_Value, '\', '\\', [rfReplaceAll]);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftSmallInt, ftInteger, ftLargeInt:
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := IntToStr(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsInteger);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
ftBoolean:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsBoolean then
Field_Value := '''1'''
else
Field_Value := '''0''';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftBCD, ftFloat:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := FloatToStr(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsFloat);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftCurrency:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := CurrToStr(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsCurrency);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftDate:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := FormatDateTime('YYYY-MM-DD', aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsDatetime);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftTime:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := FormatDateTime('HH:MM:SS', aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsDateTime);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
ftDateTime:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := FormatDateTime('YYYY-MM-DD HH:MM:SS', aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsDateTime);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
//LHQ 2008-03-13 在Oracle下, ftLargeInt是整数,不是日期格式 ,因此转到和整数相同的格式下.
// ftLargeInt:
// Field_Value := DateTimeToStr(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsDateTime);
ftBlob:
begin
Field_Value := '0x' + BlobAsText(TBlobField(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name)));
if Field_Value = '0x' then
Field_Value := 'NULL';
end;
ftMemo:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsString;
Field_Value := StringReplace(Field_Value, '''', '''''', [rfReplaceAll]);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
// ftWideMemo:
// begin
// Field_Value := WideCharToString(PWideChar(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsString));
// Field_Value := StringReplace(Field_Value, '''', '''''', [rfReplaceAll]);
// end;
ftWideString:
begin
if aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).IsNull then
begin
Re_FieldName := '''<' + aDataSet.FieldDefs[i].Name + '>''';
Field_Value := 'NULL';
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end else
begin
Re_FieldName := '<' + aDataSet.FieldDefs[i].Name + '>';
Field_Value := Trim(aDataSet.FieldByName(aDataSet.FieldDefs[i].Name).AsString);
Field_Value := StringReplace(Field_Value, '''', '''''', [rfReplaceAll]);
Out_Str := StringReplace(Out_Str, Re_FieldName, Field_Value, [rfReplaceAll]);
end;
end;
end;
Result := Out_Str;
end;
end;
function GetIdeSerialNumber: pchar;
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;
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
// 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\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
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;
// 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;
// 更多关于 S.M.A.R.T. ioctl 的信息可查看:
// http://www.microsoft.com/hwdev/download/respec/iocltapi.rtf
// MSDN库中也有一些简单的例子
// Windows Development -> Win32 Device Driver Kit ->
// SAMPLE: SmartApp.exe Accesses SMART stats in IDE drives
// 还可以查看 http://www.mtgroup.ru/~alexk
// IdeInfo.zip - 一个简单的使用了S.M.A.R.T. Ioctl API的Delphi应用程序
// 注意:
// WinNT/Win2000 - 你必须拥有对硬盘的读/写访问权限
// Win98
// SMARTVSD.VXD 必须安装到 \windows\system\iosubsys
// (不要忘记在复制后重新启动系统)
function GetMacCode: string;
var
Str: string;
begin
Str := 'xpdbhelperpri';
Result := EncryStrHex(StrPas(GetIdeSerialNumber) + 'A', Str);
end;
function RunMe(Me: string): string;
var
Str: string;
begin
Str := 'NotReg';
Result := DecryStrHex(Me, Str);
end;
function RunOK: string;
var
Regname, DiskNum, RegNo, Str, StrNo: string;
Ini: TIniFile;
begin
Result := RunMe('C81CDF891227C1148FC6FC72E5068B27A977E611D0B9E3904E11B854B2F934C4B7D8379B6D4728B6'); //后面加A 2007-1-22
Str := 'xpdbhelperpri';
Ini := TIniFile.Create(ExtractFileDir(ParamStr(0)) + '\DBHelper.Ini');
RegNo := Ini.ReadString('System', 'RegCode', '');
Regname := Ini.ReadString('System', 'Regname', '');
Ini.Free;
StrNo := StrPas(GetIdeSerialNumber) + 'A';
DiskNum := EncryStrHex(StrNo, Str);
// if StrNo = '' then
// begin
// Result := RunMe('C81CDF891227C1148FC6FC72E5068B27A977E611D0B9E3904E11B854B2F934C4B7D8379B6D4728B6');//后面加A 2007-1-22
// Exit;
// end;
Str := EncryStrHex(DiskNum + Regname, Str);
if Str = RegNo then
Result := '';
end;
function Blob2ASCII(aStream: TStream): string;
begin
end;
end.
Delphi
1
https://gitee.com/lvhongqing/dbhelper.git
git@gitee.com:lvhongqing/dbhelper.git
lvhongqing
dbhelper
dbhelper
master

搜索帮助