⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crypt.pas

📁 delphi开发的中国移动大客户管理系统,后台数据库为oracle
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -