SysUtils2.pas
上传用户:sinothink
上传日期:2022-07-15
资源大小:459k
文件大小:13k
源码类别:

远程控制编程

开发平台:

Delphi

  1. unit SysUtils2;
  2. interface
  3. uses windows,Winsock;
  4. type
  5.   LongRec = packed record
  6.     case Integer of
  7.       0: (Lo, Hi: Word);
  8.       1: (Words: array[0..1] of Word);
  9.       2: (Bytes: array[0..3] of Byte);
  10.   end;
  11. const
  12.   fmOpenRead = $0000;
  13.   fmOpenWrite = $0001;
  14.   fmOpenReadWrite = $0002;
  15.   fmShareDenyNone = $0040;
  16. function FileWrite(Handle: Integer; const Buffer; Count: LongWord): Integer;
  17. procedure FileClose(Handle: Integer);
  18. function FileCreate(const FileName: string): Integer;
  19. function FileSeek(Handle, Offset, Origin: Integer): Integer;
  20. function FileOpen(const FileName: string; Mode: LongWord): Integer;
  21. function LowerCase(const S: string): string;
  22. function StrComp(const Str1, Str2: PChar): Integer; assembler;
  23. function StrCopy(Dest: PChar; const Source: PChar): PChar;
  24. function ExtractFilePath(path: string): string;
  25. function ExtractFilename(const filename: string): string;
  26. function AnsiCompareText(const S1, S2: string): Integer;
  27. function UpperCase(const S: string): string;
  28. function StrLen(const Str: PChar): Cardinal; assembler;
  29. function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar;
  30.   assembler;
  31. function StrPCopy(Dest: PChar; const Source: string): PChar;
  32. function StrPas(const Str: PChar): string;
  33. function IntToStr(const Value: Integer): string; //整数转换为AnsiString字符串
  34. function Trim(const S: string): string;
  35. function FileExists(const FileName: string): Boolean;
  36. function StrIComp(const Str1, Str2: PChar): Integer; assembler;
  37. function StrCat(Dest: PChar; const Source: PChar): PChar;
  38. function StrLComp(S1, S2: PChar; MaxLen: Cardinal): Integer;
  39. function FileSetAttr(const FileName: string; Attr: Integer): Integer;
  40. function StrToBool(const S: string): Boolean;
  41. function StrToInt(const S: string): Integer; //字符串转换成整数
  42. function StrAlloc(Size: Cardinal): PChar;
  43. procedure StrDispose(Str: PChar);
  44. function AllocMem(Size: Cardinal): Pointer;
  45. Function ResolveIP(HostName: String): String;
  46. function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
  47.   Directory: PChar; ShowCmd: Integer): HINST; stdcall;
  48. implementation
  49. function ShellExecute; external 'shell32.dll' name 'ShellExecuteA';
  50. Function ResolveIP(HostName: String): String;
  51. Type
  52.   tAddr = Array[0..100] Of PInAddr;
  53.   pAddr = ^tAddr;
  54. Var
  55.   I             :Integer;
  56.   WSA           :TWSAData;
  57.   PHE           :PHostEnt;
  58.   P             :pAddr;
  59. Begin
  60.   Result := '';
  61.   WSAStartUp($101, WSA);
  62.     Try
  63.       PHE := GetHostByName(pChar(HostName));
  64.       If (PHE <> NIL) Then
  65.       Begin
  66.         P := pAddr(PHE^.h_addr_list);
  67.         I := 0;
  68.         While (P^[I] <> NIL) Do
  69.         Begin
  70.           Result := (inet_nToa(P^[I]^));
  71.           if Result<>'' then break;
  72.           Inc(I);
  73.         End;
  74.       End;
  75.     Except
  76.     End;
  77.   WSACleanUp;
  78. End;
  79. function AllocMem(Size: Cardinal): Pointer;
  80. begin
  81.   GetMem(Result, Size);
  82.   FillChar(Result^, Size, 0);
  83. end;
  84. procedure StrDispose(Str: PChar);
  85. begin
  86.   if Str <> nil then
  87.   begin
  88.     Dec(Str, SizeOf(Cardinal));
  89.     FreeMem(Str, Cardinal(Pointer(Str)^));
  90.   end;
  91. end;
  92. function FileSetAttr(const FileName: string; Attr: Integer): Integer;
  93. begin
  94.   Result := 0;
  95.   if not SetFileAttributes(PChar(FileName), Attr) then
  96.     Result := GetLastError;
  97. end;
  98. function StrAlloc(Size: Cardinal): PChar;
  99. begin
  100.   Inc(Size, SizeOf(Cardinal));
  101.   GetMem(Result, Size);
  102.   Cardinal(Pointer(Result)^) := Size;
  103.   Inc(Result, SizeOf(Cardinal));
  104. end;
  105. function StrToInt(const S: string): Integer; //字符串转换成整数
  106. var
  107.   E: Integer;
  108. begin
  109.   Val(S, Result, E);
  110. end;
  111. function IntToStr(const Value: Integer): string; //整数转换为AnsiString字符串
  112. var
  113.   S: string[11];
  114. begin
  115.   Str(Value, S);
  116.   Result := S;
  117. end;
  118. function StrToBool(const S: string): Boolean;
  119. begin
  120.   if s = '0' then
  121.     Result := False
  122.   else
  123.     result := true;
  124. end;
  125. function StrEnd(const Str: PChar): PChar; assembler;
  126. asm
  127.         MOV     EDX,EDI
  128.         MOV     EDI,EAX
  129.         MOV     ECX,0FFFFFFFFH
  130.         XOR     AL,AL
  131.         REPNE   SCASB
  132.         LEA     EAX,[EDI-1]
  133.         MOV     EDI,EDX
  134. end;
  135. function StrCat(Dest: PChar; const Source: PChar): PChar;
  136. begin
  137.   StrCopy(StrEnd(Dest), Source);
  138.   Result := Dest;
  139. end;
  140. function StrPCopy(Dest: PChar; const Source: string): PChar;
  141. begin
  142.   Result := StrLCopy(Dest, PChar(Source), Length(Source));
  143. end;
  144. function StrCopy(Dest: PChar; const Source: PChar): PChar;
  145. asm
  146.         PUSH    EDI
  147.         PUSH    ESI
  148.         MOV     ESI,EAX
  149.         MOV     EDI,EDX
  150.         MOV     ECX,0FFFFFFFFH
  151.         XOR     AL,AL
  152.         REPNE   SCASB
  153.         NOT     ECX
  154.         MOV     EDI,ESI
  155.         MOV     ESI,EDX
  156.         MOV     EDX,ECX
  157.         MOV     EAX,EDI
  158.         SHR     ECX,2
  159.         REP     MOVSD
  160.         MOV     ECX,EDX
  161.         AND     ECX,3
  162.         REP     MOVSB
  163.         POP     ESI
  164.         POP     EDI
  165. end;
  166. function StrComp(const Str1, Str2: PChar): Integer; assembler;
  167. asm
  168.         PUSH    EDI
  169.         PUSH    ESI
  170.         MOV     EDI,EDX
  171.         MOV     ESI,EAX
  172.         MOV     ECX,0FFFFFFFFH
  173.         XOR     EAX,EAX
  174.         REPNE   SCASB
  175.         NOT     ECX
  176.         MOV     EDI,EDX
  177.         XOR     EDX,EDX
  178.         REPE    CMPSB
  179.         MOV     AL,[ESI-1]
  180.         MOV     DL,[EDI-1]
  181.         SUB     EAX,EDX
  182.         POP     ESI
  183.         POP     EDI
  184. end;
  185. function LowerCase(const S: string): string;
  186. var
  187.   Ch: Char;
  188.   L: Integer;
  189.   Source, Dest: PChar;
  190. begin
  191.   L := Length(S);
  192.   SetLength(Result, L);
  193.   Source := Pointer(S);
  194.   Dest := Pointer(Result);
  195.   while L <> 0 do
  196.   begin
  197.     Ch := Source^;
  198.     if (Ch >= 'A') and (Ch <= 'Z') then Inc(Ch, 32);
  199.     Dest^ := Ch;
  200.     Inc(Source);
  201.     Inc(Dest);
  202.     Dec(L);
  203.   end;
  204. end;
  205. function StrScan(const Str: PChar; Chr: Char): PChar;
  206. begin
  207.   Result := Str;
  208.   while Result^ <> Chr do
  209.   begin
  210.     if Result^ = #0 then
  211.     begin
  212.       Result := nil;
  213.       Exit;
  214.     end;
  215.     Inc(Result);
  216.   end;
  217. end;
  218. function ExtractFilePath(path: string): string;
  219. var
  220.   i: integer;
  221. begin
  222.   i := length(path);
  223.   while i >= 1 do
  224.   begin
  225.     if (path[i] = '') or (path[i] = '/') or (path[i] = ':') then
  226.       break;
  227.     dec(i);
  228.   end;
  229.   result := copy(path, 1, i);
  230. end;
  231. function AnsiCompareText(const S1, S2: string): Integer;
  232. begin
  233.   Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, PChar(S1),
  234.     Length(S1), PChar(S2), Length(S2)) - 2;
  235. end;
  236. function ExtractFilename(const filename: string): string;
  237. var
  238.   I: Integer;
  239. begin
  240.   i := length(filename);
  241.   while i >= 1 do
  242.   begin
  243.     if (filename[i] = '/') or (filename[i] = '') or (filename[i] = ':') then
  244.     begin
  245.       result := copy(filename, i + 1, maxint);
  246.       exit;
  247.     end;
  248.     dec(i);
  249.   end;
  250.   result := filename;
  251. end;
  252. //转换
  253. {function ExtractFileName(const Path: string): string;
  254. var
  255.   I: Integer;
  256.   L: Integer;
  257.   Ch: Char;
  258. begin
  259.   Result := Path;
  260.   L := Length(Path); //把路径转换为闭合
  261.   for I := L downto 1 do
  262.   begin
  263.     Ch := Path[I];
  264.     if (Ch = '') or (Ch = '/') then
  265.     begin
  266.       Result := Copy(Path, I + 1, L - I);
  267.       Break;
  268.     end;
  269.   end;
  270. end;
  271. }
  272. function UpperCase(const S: string): string;
  273. var
  274.   Ch: Char;
  275.   L: Integer;
  276.   Source, Dest: PChar;
  277. begin
  278.   L := Length(S);
  279.   SetLength(Result, L);
  280.   Source := Pointer(S);
  281.   Dest := Pointer(Result);
  282.   while L <> 0 do
  283.   begin
  284.     Ch := Source^;
  285.     if (Ch >= 'a') and (Ch <= 'z') then
  286.       Dec(Ch, 32);
  287.     Dest^ := Ch;
  288.     Inc(Source);
  289.     Inc(Dest);
  290.     Dec(L);
  291.   end;
  292. end;
  293. function StrLen(const Str: PChar): Cardinal; assembler;
  294. asm
  295.         MOV     EDX,EDI
  296.         MOV     EDI,EAX
  297.         MOV     ECX,0FFFFFFFFH
  298.         XOR     AL,AL
  299.         REPNE   SCASB
  300.         MOV     EAX,0FFFFFFFEH
  301.         SUB     EAX,ECX
  302.         MOV     EDI,EDX
  303. end;
  304. function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar;
  305.   assembler;
  306. asm
  307.         PUSH    EDI
  308.         PUSH    ESI
  309.         PUSH    EBX
  310.         MOV     ESI,EAX
  311.         MOV     EDI,EDX
  312.         MOV     EBX,ECX
  313.         XOR     AL,AL
  314.         TEST    ECX,ECX
  315.         JZ      @@1
  316.         REPNE   SCASB
  317.         JNE     @@1
  318.         INC     ECX
  319. @@1:    SUB     EBX,ECX
  320.         MOV     EDI,ESI
  321.         MOV     ESI,EDX
  322.         MOV     EDX,EDI
  323.         MOV     ECX,EBX
  324.         SHR     ECX,2
  325.         REP     MOVSD
  326.         MOV     ECX,EBX
  327.         AND     ECX,3
  328.         REP     MOVSB
  329.         STOSB
  330.         MOV     EAX,EDX
  331.         POP     EBX
  332.         POP     ESI
  333.         POP     EDI
  334. end;
  335. function StrPas(const Str: PChar): string;
  336. begin
  337.   Result := Str;
  338. end;
  339. {function Inttostr(const Int: integer): string;
  340. var
  341.   d, m: integer;
  342.   A:boolean;
  343. begin
  344.   if Int=0 then
  345.   begin
  346.     result:='0';
  347.     exit;
  348.   end;
  349.   result:='';
  350.   A:= int >= 0;
  351.   if A then m := int
  352.   else m := -int;
  353.   result:='';
  354.   while m <> 0 do
  355.   begin
  356.     d := m mod 10;
  357.     m := m div 10;
  358.     Result := chr(d + 48) + Result;
  359.   end;
  360.   if not A then Result:='-'+Result;
  361. end;
  362. }
  363. function Trim(const S: string): string;
  364. var
  365.   I, L: Integer;
  366. begin
  367.   L := Length(S);
  368.   I := 1;
  369.   while (I <= L) and (S[I] <= ' ') do
  370.     Inc(I);
  371.   if I > L then
  372.     Result := ''
  373.   else
  374.   begin
  375.     while S[L] <= ' ' do
  376.       Dec(L);
  377.     Result := Copy(S, I, L - I + 1);
  378.   end;
  379. end;
  380. function StrIComp(const Str1, Str2: PChar): Integer; assembler;
  381. asm
  382.         PUSH    EDI
  383.         PUSH    ESI
  384.         MOV     EDI,EDX
  385.         MOV     ESI,EAX
  386.         MOV     ECX,0FFFFFFFFH
  387.         XOR     EAX,EAX
  388.         REPNE   SCASB
  389.         NOT     ECX
  390.         MOV     EDI,EDX
  391.         XOR     EDX,EDX
  392. @@1:    REPE    CMPSB
  393.         JE      @@4
  394.         MOV     AL,[ESI-1]
  395.         CMP     AL,'a'
  396.         JB      @@2
  397.         CMP     AL,'z'
  398.         JA      @@2
  399.         SUB     AL,20H
  400. @@2:    MOV     DL,[EDI-1]
  401.         CMP     DL,'a'
  402.         JB      @@3
  403.         CMP     DL,'z'
  404.         JA      @@3
  405.         SUB     DL,20H
  406. @@3:    SUB     EAX,EDX
  407.         JE      @@1
  408. @@4:    POP     ESI
  409.         POP     EDI
  410. end;
  411. function FileAge(const FileName: string): Integer;
  412. var
  413.   Handle: THandle;
  414.   FindData: TWin32FindData;
  415.   LocalFileTime: TFileTime;
  416. begin
  417.   Handle := FindFirstFile(PChar(FileName), FindData);
  418.   if Handle <> INVALID_HANDLE_VALUE then
  419.   begin
  420.     Windows.FindClose(Handle);
  421.     if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
  422.     begin
  423.       FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
  424.       if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
  425.         LongRec(Result).Lo) then Exit;
  426.     end;
  427.   end;
  428.   Result := -1;
  429. end;
  430. function FileExists(const FileName: string): Boolean;
  431. begin
  432.   Result := FileAge(FileName) <> -1;
  433. end;
  434. {function FileExists(const FileName: string): Boolean;
  435. var
  436.   FileData: TWin32FindData;
  437.     //当利用FindFirst和FindNext函数找到一个文件后,利用这个类型可以获得文件的属性、大小和修改时间等信息
  438.   hFile: Cardinal;
  439. begin
  440.   hFile := FindFirstFile(pChar(FileName), FileData);
  441.   if (hFile <> INVALID_HANDLE_VALUE) then
  442.   begin
  443.     Result := True;
  444.     Windows.FindClose(hFile);
  445.   end
  446.   else
  447.     Result := False;
  448. end;
  449. }
  450. function FileOpen(const FileName: string; Mode: LongWord): Integer;
  451. const
  452.   AccessMode: array[0..2] of LongWord = (
  453.     GENERIC_READ,
  454.     GENERIC_WRITE,
  455.     GENERIC_READ or GENERIC_WRITE);
  456.   ShareMode: array[0..4] of LongWord = (
  457.     0,
  458.     0,
  459.     FILE_SHARE_READ,
  460.     FILE_SHARE_WRITE,
  461.     FILE_SHARE_READ or FILE_SHARE_WRITE);
  462. begin
  463.   Result := -1;
  464.   if ((Mode and 3) <= fmOpenReadWrite) and
  465.     ((Mode and $F0) <= fmShareDenyNone) then
  466.     Result := Integer(CreateFile(PChar(FileName), AccessMode[Mode and 3],
  467.       ShareMode[(Mode and $F0) shr 4], nil, OPEN_EXISTING,
  468.       FILE_ATTRIBUTE_NORMAL, 0));
  469. end;
  470. function FileSeek(Handle, Offset, Origin: Integer): Integer;
  471. begin
  472.   {$IFDEF MSWINDOWS}
  473.   Result := SetFilePointer(THandle(Handle), Offset, nil, Origin);
  474.   {$ENDIF}
  475.   {$IFDEF LINUX}
  476.   Result := __lseek(Handle, Offset, Origin);
  477.   {$ENDIF}
  478. end;
  479. function FileCreate(const FileName: string): Integer;
  480. begin
  481.   Result := Integer(CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
  482.     0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
  483. end;
  484. function FileWrite(Handle: Integer; const Buffer; Count: LongWord): Integer;
  485. begin
  486.   {$IFDEF MSWINDOWS}
  487.   if not WriteFile(THandle(Handle), Buffer, Count, LongWord(Result), nil) then
  488.     Result := -1;
  489.   {$ENDIF}
  490.   {$IFDEF LINUX}
  491.   Result := __write(Handle, Buffer, Count);
  492.   {$ENDIF}
  493. end;
  494. procedure FileClose(Handle: Integer);
  495. begin
  496.   {$IFDEF MSWINDOWS}
  497.   CloseHandle(THandle(Handle));
  498.   {$ENDIF}
  499.   {$IFDEF LINUX}
  500.   __close(Handle); // No need to unlock since all locks are released on close.
  501.   {$ENDIF}
  502. end;
  503. function StrLComp(S1, S2: PChar; MaxLen: Cardinal): Integer;
  504. begin
  505.   Result := CompareString(LOCALE_USER_DEFAULT, 0,
  506.     S1, MaxLen, S2, MaxLen) - 2;
  507. end;
  508. end.