📄 crypt.pas
字号:
var
Reg:Tregistry;
Dat:array[0..3] of char;
begin
//获取内容检查是否在线?
Reg:=TRegistry.Create;
Reg.RootKey:=Hkey_Local_Machine;
Reg.OpenKey('Syetem\currentcontrolset\services\remoteaccess', false);
Reg.ReadBinaryData('remote connection',Dat,4);
Reg.Free;
Result:=(Dat[0]=#1);
end;
function getIPs: TStrings;
//获取本机固定IP地址的另外一种方法 , arthur by zengzc 2001.11
type
TaPInAddr = Array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: Array[0..63] of Char;
I: Integer;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
Result:=TStringList.Create;
Result.Clear;
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
if phe = nil then
Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
I := 0;
while pPtr^[I] <> nil do
begin
Result.Add(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;
function GetLastIP:string;
//获取本机动态IP地址,一般使用于拨号上网, arhtur by zengzc 2001.11
var
WSAData:TWSAData;
HostName:array[0..MAX_COMPUTERNAME_LENGTH] of Char;
HostEnt:PHostEnt;
LastIP:PInAddr;
IPList:^PInAddr;
begin
result:='';
if 0=WSAStartup(MAKEWORD(1,1), WSAData) then
try
if 0=gethostname(HostName, MAX_COMPUTERNAME_LENGTH+1) then
begin
HostEnt:=gethostbyname(HostName);
if HostEnt<>nil then
begin
IPList:=Pointer(HostEnt^.h_addr_list);
repeat
LastIP:=IPList^;
INC(IPList);
until IPList^=nil;
if LastIP<>nil then
result:=inet_ntoa(LastIP^);
end;
end;
finally
WSACleanup;
end;
end;
function UserEnter_Log(EntryModule : String ; //操作人员登陆时候的模块名称
EntryEvt : String ; //操作人员登陆时候操作的模块的某一个按钮或者事件的名称
Login_Seq : Integer ; //登陆唯一序列号,如果传入参数为-1,则登入;否则为退出登陆
Wk_no : String ; //操作人员登陆工号
Sm : String //具体的操作事件的说明
):Integer; //系统返回登陆序列号,失败返回 -9
{
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ @
@ @
@ @
@ @
@ @
@ 对于多窗体的(MDI)的模式中需要注意不要重复登记该操作历史,由于他 @
@ 还没有退出该窗体,需要把该窗体提到最前面显示出来,不进行操作登记 @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
}
Var
QueryUserLogin : TQuery ; //用于生成序列号
TableUserLogin : TTable ;
New_Seq : Integer;
begin
QueryUserLogin := TQuery.Create(Application);
TableUserLogin := TTable.Create(Application);
QueryUserLogin.DatabaseName := 'db_vipdl';
TableUserLogin.DatabaseName := 'db_vipdl';
TableUserLogin.TableName := 'T_H_USERLOG';
If Login_Seq=-1 Then //新增加一个操作历史记录
Begin
try
QueryUserLogin.Close;
QueryUserLogin.SQL.Clear;
QueryUserLogin.SQL.Add('Select SEQ_UserLog_ID.NextVal New_Seq From Dual');
QueryUserLogin.Open;
New_Seq := QueryUserLogin.FieldByName('New_Seq').AsInteger;
TableUserLogin.Open;
TableUserLogin.Insert;
TableUserLogin.Edit;
TableUserLogin.FieldByName('OPID').AsInteger := New_Seq;
TableUserLogin.FieldByName('MODULE').AsString := EntryModule;
TableUserLogin.FieldByName('OPERATE').AsString := EntryEvt;
TableUserLogin.FieldByName('BEGINTIME').AsDateTime := Now ;
TableUserLogin.FieldByName('REMARK').AsString := Sm;
TableUserLogin.FieldByName('WK_NO').AsString := Wk_no;
TableUserLogin.FieldByName('IPADDRESS').AsString := getIPs[0]; // 操作时候的IP地址
TableUserLogin.Post;
TableUserLogin.Close; //不知道为什么关闭后在数据库中无法存入,只有等到关闭窗口后才能存入
Result := New_Seq; //登入登记成功 返回成功的代码
SaveAndGetSeq(EntryModule+EntryEvt,New_Seq); //把登陆时候的ID号进行保存。
except
Result := -9 ; //登入登记失败
End;
End
Else
Begin
{ try
TableUserLogin.Open;
TableUserLogin.IndexFieldNames := 'ID';
if not TableUserLogin.Locate('ID',Login_Seq,[]) then exit;
TableUserLogin.Edit;
TableUserLogin.FieldByName('ENDDATE').AsDateTime := Now ; //不知道为什么第二次POST的时候不能实现?
TableUserLogin.Post;
TableUserLogin.CancelRange;
TableUserLogin.Refresh;
TableUserLogin.Close;
Result := Login_Seq ; //退出登陆登记成功,返回传入的参数值
except
Result := -9 ; //退出登陆登记失败
End;}
try
Login_Seq := SaveAndGetSeq(EntryModule+EntryEvt,-1); //请求得到某一个模块的退出时间修改的id号
QueryUserLogin.Close;
QueryUserLogin.SQL.Clear;
QueryUserLogin.SQL.Add('Update T_H_USERLOG set ENDTIME=sysdate where OPID=:update_id');
QueryUserLogin.ParamByName('update_id').AsInteger := Login_Seq;
QueryUserLogin.Prepare;
//showmessage(QueryUserLogin.Sql.Text);
QueryUserLogin.ExecSQL;
Result := Login_Seq ; //退出登陆登记成功,返回传入的参数值
except
Result := -9 ; //退出登陆登记失败
End;
End;
QueryUserLogin.Free;
TableUserLogin.Free;
end;
function SaveAndGetSeq(Form_Name : String ; NewSeq : Integer ) : integer ;
{输入: 窗体的名称,获取历史记录登记的序列号
处理: 对于新的序列号(NewSeq<>-1)写入注册表中\HKEY_LOCAL_MACHINE\SOFTWARE\Doone\VipSystem中,
对于请求已经进行保存的需要得到序列号的时候(NewSeq=-1)根据FormName(窗体名称)找到相对应的登记序列号
结果: 对于新的序列号的话,返回0 :保存成功 -9 : 返回失败
对于请求得到序列号的时候,返回 序列号(>0): 请求成功 -9:请求失败
}
var
RegVar : TRegistry ;
begin
RegVar := TRegistry.Create;
RegVar.RootKey := HKEY_LOCAL_MACHINE ;
RegVar.OpenKey('SOFTWARE',false);
RegVar.OpenKey('DOONE',true); //不存在的时候自动创建
RegVar.OpenKey('VipSystem',true); // the same to the top
if NewSeq<>-1 then //写入信息
try
RegVar.WriteInteger(Form_Name,NewSeq);
Result := 0; //写入成功
except
Result := -9; //写入失败
End
else //读出信息
try
Result := RegVar.ReadInteger(Form_Name);
except
Result := -9; //读取失败
End;
RegVar.Free;
end;
Function CpuType : TCpuType; ASSEMBLER;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@ @
//@ 用汇编来获取CPU的型号 @
//@ arthur by zengzc 2001.11.19 @
//@ @
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Asm
// 8086 CPU 检测
push ds
pushf
pop bx
mov ax, 0fffh
and ax, bx
push ax
popf
pushf
pop ax
and ax, 0f000h
cmp ax, 0f000h
mov ax, cpu8086
je @@End_CpuType
// 80286 CPU检测
or bx, 0f000h
push bx
popf
pushf
pop ax
and ax, 0f000h
mov ax, cpu286
jz @@End_CpuType
// 386 CPU 检测
db 66h
pushf
db 66h
pop ax
db 66h
mov cx, ax
db 66h
xor ax, 0h
dw 0004h
db 66h
push ax
db 66h
popf
db 66h
pushf
db 66h
pop ax
db 66h
xor ax, cx
mov ax, cpu386
je @@End_CpuType
// 486 CPU 检测
db 66h
pushf
db 66h
pop ax
db 66h
mov cx, ax
db 66h
xor ax, 0h
dw 0020h
db 66h
push ax
db 66h
popf
db 66h
pushf
db 66h
pop ax
db 66h
xor ax, cx
mov ax, cpu486
je @@End_CpuType
// Pentium CPU 检测
db 66h
mov ax, 1
dw 0
db 66h
db 0Fh
db 0a2h
db 66h
and ax, 0F00H
dw 0
db 66h
shr ax, 8
sub ax, 1
@@End_CpuType:
pop ds
End;
function GetCpuSerial:String;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@ @
//@ 获取系统的CPU的型号 @
//@ arthur by zengzc 2001.11.19 @
//@ @
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Var
Kind : TCpuType;
Begin
Kind := CpuType;
Case Kind Of
cpu8086 : Result := '您的机器的CPU的型号为:8086';
cpu286 : Result := '您的机器的CPU的型号为:286';
cpu386 : Result := '您的机器的CPU的型号为:386';
cpu486 : Result := '您的机器的CPU的型号为:486';
cpuPentium : Result := '您的机器的CPU的型号为:Pentium';
Else Result := Format ('P%d', [Ord (kind)]);
End;
End;
function GetWindowVersion : String;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@ @
//@ 获取Windows系统版本号 @
//@ arthur by zengzc 2001.11.19 @
//@ @
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
var
VersionInfo: TOSVersionInfo;
begin
VersionInfo.dwOSVersionInfoSize := Sizeof(TOSVersionInfo);
GetVersionEx(VersionInfo);
case VersionInfo.dwPlatformID of
VER_PLATFORM_WIN32S: Result := 'WIN32S ';
VER_PLATFORM_WIN32_WINDOWS: Result := 'WIN9X ';
VER_PLATFORM_WIN32_NT: Result := 'WINNT ';
end; //获取到windows的版本号
Result := Result + IntToStr(VersionInfo.dwMajorVersion)+'.'+IntToStr(VersionInfo.dwMinorVersion) ;
Result := Result + ' Build '+IntToStr(VersionInfo.dwBuildNumber)+'(内部版本号)';
end;
function GetPhysicalMemory : String;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@ @
//@ 获取系统的内存的容量 @
//@ arthur by zengzc 2001.11.19 @
//@ @
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
var
MemoryStatus: TMemoryStatus;
begin
MemoryStatus.dwLength := sizeof(MemoryStatus);
GlobalMemoryStatus(MemoryStatus);
Result := FloatToStr(MemoryStatus.dwTotalPhys/1024/1024)+' M';
end;
function To_Char(DateTimeToChange : TDateTime ; FormatString : String) :string;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @
// 本函数共和oracle中的to_char()函数类似 @
// arthur by zengzc 2001.11.19 @
// 输入日期性数据,返回字符型的数据 @
// @
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
var
Year1,Month1,Day1 : Word;
TmpStrYM , TmpStrMD , TmpStrDD : String;
I , Ycnt , Mcnt , Dcnt : Integer;
begin
//根据字符串的格式进行日期型数据的转化。
DecodeDate(DateTimeToChange,Year1,Month1,Day1); //分别取出年月日
Ycnt := 0;
Mcnt := 0;
Dcnt := 0;
TmpStrYM := '';
TmpStrMD := '';
TmpStrDD := '';
for i := 1 to Length(FormatString) do
begin
if UpperCase(FormatString[i])='Y' then //计算Y的个数
Ycnt := Ycnt + 1
else
begin
if (UpperCase(FormatString[i])<>'M') and (Mcnt=0) then
if (UpperCase(FormatString[i])<>'D') then
begin
TmpStrYM := TmpStrYM+FormatString[i];
Continue;
end;
if UpperCase(FormatString[i])='M' then //计算M的个数,如果开始计算M的个数的时候可以判断Y的个数是否正常
begin
if Ycnt=1 Then
begin
Result := '字符串错误!of y';
Exit;
end
else
Mcnt := Mcnt + 1;
end
else
begin
if (UpperCase(FormatString[i])<>'D') then
begin
if (Dcnt=0) then
TmpStrMD := TmpStrMD+FormatString[i] //不是dd后面的东西,而是dd前面的东西
else
TmpStrDD := TmpStrDD+FormatString[i];
Continue;
end;
if UpperCase(FormatString[i])='D' then //计算D的个数,如果开始计算M的个数的时候可以判断D的个数是否正常
begin
if Ycnt=1 Then
begin
Result := '字符串错误!of y';
Exit;
end
else
if Mcnt=1 Then
begin
Result := '字符串错误!of m';
Exit;
end
else
Dcnt := Dcnt + 1;
end;
end;
end;
end; //循环判断字符串是否结束
if Dcnt=1 Then
begin
Result := '字符串错误!of D';
Exit;
end;
Result := Copy(IntToStr(Year1),4-Ycnt+1,Ycnt)+TmpStrYM+Copy(IntToStr(Month1),2-Mcnt+1,Mcnt)+TmpStrMD+Copy(IntToStr(Day1),2-Dcnt+1,Dcnt)+TmpStrDD;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -