hxSysUtils.pas
上传用户:youjie821
上传日期:2013-01-27
资源大小:459k
文件大小:7k
源码类别:

PlugIns编程

开发平台:

Delphi

  1. unit hxSysUtils;
  2. interface
  3. uses
  4.   Windows, Classes, ComCtrls, SysUtils, ComStrs, TlHelp32, hxFileRes;
  5.   procedure StreamWriteInteger(Stream: TStream; Value: Integer);
  6.   function StreamReadInteger(Stream: TStream): Integer;
  7.   procedure StreamWriteByte(Stream: TStream; Value: Byte);
  8.   function StreamReadByte(Stream: TStream): Byte;
  9.   procedure StreamWriteString(Stream: TStream; Value: string);
  10.   function StreamReadString(Stream: TStream): string;
  11.   procedure StreamWriteResInfo(Stream: TStream; ResInfo: TResInfo);
  12.   function StreamReadResInfo(Stream: TStream): TResInfo;
  13.   procedure StreamWriteTreeNodes(Stream: TStream; TreeNodes: TTreeNodes);
  14.   procedure StreamReadTreeNodes(Stream: TStream; TreeNodes: TTreeNodes);
  15.   function FormatDirectoryName(Dir: string): string;
  16.   function FileInUsing(FileName: string): Boolean;
  17.   procedure KillProcess(ExeName: string);
  18. implementation
  19. procedure StreamWriteInteger(Stream: TStream; Value: Integer);
  20. begin
  21.   Stream.Write(Value, sizeof(Integer));
  22. end;
  23. function StreamReadInteger(Stream: TStream): Integer;
  24. begin
  25.   Stream.Read(Result, sizeof(Integer));
  26. end;
  27. procedure StreamWriteByte(Stream: TStream; Value: Byte);
  28. begin
  29.   Stream.Write(Value, sizeof(Byte));
  30. end;
  31. function StreamReadByte(Stream: TStream): Byte;
  32. begin
  33.   Stream.Read(Result, sizeof(Byte));
  34. end;
  35. procedure StreamWriteString(Stream: TStream; Value: string);
  36. var
  37.   Len: Integer;
  38. begin
  39.   Len:= Length(Value);
  40.   StreamWriteInteger(Stream, Len);
  41.   Stream.Write(Value[1], Len);
  42. end;
  43. function StreamReadString(Stream: TStream): string;
  44. var
  45.   Len: Integer;
  46. begin
  47.   Len:= StreamReadInteger(Stream);
  48.   SetLength(Result, Len);
  49.   Stream.Read(Result[1], Len);
  50. end;
  51. procedure StreamWriteResInfo(Stream: TStream; ResInfo: TResInfo);
  52. begin
  53.   with ResInfo do
  54.   begin
  55.     StreamWriteString(Stream, FileName);   // 包括相对路径(如MyDirMyfile.exe)
  56.     StreamWriteString(Stream, Description);// 描述信息
  57.     StreamWriteInteger(Stream, FileSize);  // 文件大小 
  58.     StreamWriteInteger(Stream, FileAttr);  // 文件属性
  59.     StreamWriteString(Stream, Version);    // 版本号(IP地址格式)
  60.     StreamWriteByte(Stream, Byte(ResType));// 资源文件类型
  61.     StreamWriteString(Stream, DownloadURL);// 资源的相对下载路径
  62.   end;
  63. end;
  64. function StreamReadResInfo(Stream: TStream): TResInfo;
  65. begin
  66.   with Result do
  67.   begin
  68.     FileName:= StreamReadString(Stream);   // 包括相对路径(如MyDirMyfile.exe)
  69.     Description:= StreamReadString(Stream);// 描述信息
  70.     FileSize:=  StreamReadInteger(Stream); // 文件大小 
  71.     FileAttr:= StreamReadInteger(Stream);  // 文件属性
  72.     Version:= StreamReadString(Stream);    // 版本号(IP地址格式)
  73.     ResType:= TResType(StreamReadByte(Stream)); // 资源文件类型
  74.     DownloadURL:= StreamReadString(Stream); // 资源的相对下载路径
  75.   end;
  76. end;
  77. procedure StreamWriteTreeNodes(Stream: TStream; TreeNodes: TTreeNodes);
  78. const
  79.   TabChar = #9;
  80.   EndOfLine = #13#10;
  81. var
  82.   i: Integer;
  83.   ANode: TTreeNode;
  84.   NodeStr: string;
  85.   ms: TStream;
  86. begin
  87.   ms:= TMemoryStream.Create;
  88.   try
  89.     if TreeNodes.Count > 0 then
  90.     begin
  91.       ANode := TreeNodes[0];
  92.       while ANode <> nil do
  93.       begin
  94.         NodeStr := '';
  95.         for i := 0 to ANode.Level - 1 do
  96.           NodeStr := NodeStr + TabChar;
  97.         NodeStr := NodeStr + ANode.Text + EndOfLine;
  98.         ms.Write(Pointer(NodeStr)^, Length(NodeStr));
  99.         ANode := ANode.GetNext;
  100.       end;
  101.     end;
  102.     StreamWriteInteger(Stream, ms.Size);
  103.     Stream.CopyFrom(ms, 0);
  104.   finally
  105.     ms.Free;
  106.   end;
  107. end;
  108. procedure StreamReadTreeNodes(Stream: TStream; TreeNodes: TTreeNodes);
  109.   function GetBufStart(Buffer: PChar; var Level: Integer): PChar;
  110.   begin
  111.     Level := 0;
  112.     while Buffer^ in [' ', #9] do
  113.     begin
  114.       Inc(Buffer);
  115.       Inc(Level);
  116.     end;
  117.     Result := Buffer;
  118.   end;
  119. var
  120.   List: TStringList;
  121.   ANode, NextNode: TTreeNode;
  122.   ALevel, I, C: Integer;
  123.   CurrStr: string;
  124.   ms: TMemoryStream;
  125. begin
  126.   List := TStringList.Create;
  127.   TreeNodes.BeginUpdate;
  128.   try
  129.     try
  130.       TreeNodes.Clear;
  131.       ms:= TMemoryStream.Create;
  132.       try
  133.         C:= StreamReadInteger(Stream);
  134.         ms.CopyFrom(Stream, C);
  135.         ms.Position:= 0;
  136.         List.LoadFromStream(ms);
  137.         ANode := nil;
  138.         for I := 0 to List.Count - 1 do
  139.         begin
  140.           CurrStr := GetBufStart(PChar(List[I]), ALevel);
  141.           if ANode = nil then
  142.             ANode := TreeNodes.AddChild(nil, CurrStr)
  143.           else if ANode.Level = ALevel then
  144.             ANode := TreeNodes.AddChild(ANode.Parent, CurrStr)
  145.           else if ANode.Level = (ALevel - 1) then
  146.             ANode := TreeNodes.AddChild(ANode, CurrStr)
  147.           else if ANode.Level > ALevel then
  148.           begin
  149.             NextNode := ANode.Parent;
  150.             while NextNode.Level > ALevel do
  151.               NextNode := NextNode.Parent;
  152.             ANode := TreeNodes.AddChild(NextNode.Parent, CurrStr);
  153.           end
  154.           else
  155.             raise ETreeViewError.CreateFmt(sInvalidLevelEx, [ALevel, CurrStr]);
  156.         end;
  157.       finally
  158.         ms.Free;
  159.       end;
  160.     finally
  161.       TreeNodes.EndUpdate;
  162.       List.Free;
  163.     end;
  164.   except
  165.     TreeNodes.Owner.Invalidate;  // force repaint on exception
  166.     raise;
  167.   end;
  168. end;
  169. function FormatDirectoryName(Dir: string): string;
  170. begin
  171.   if Dir[Length(Dir)] <> '' then
  172.     Result:= Dir + ''
  173.   else
  174.     Result:= Dir;
  175. end;
  176. function FileInUsing(FileName: string): Boolean;
  177. var
  178.   F: Integer;
  179. begin
  180.   F:= FileOpen(FileName, fmOpenReadWrite or fmShareExclusive);
  181.   if F = -1 then
  182.     Result:= False
  183.   else
  184.   begin
  185.     FileClose(F);
  186.     Result:= True;
  187.   end;
  188. end;
  189. procedure KillProcess(ExeName: string);
  190. const
  191.   PROCESS_TERMINATE = $0001; //进程的PROCESS_TERMINATE访问权限
  192. var
  193.   ContinueLoop: Boolean;
  194.   FSnapshotHandle: THandle;
  195.   FProcessEntry32: TProcessEntry32;
  196. begin
  197.   //获取系统所有进程快照
  198.   FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  199.   //调用Process32First前用Sizeof(FProcessEntry32)填充FProcessEntry32.dwSize
  200.   FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  201.   //获取快照中第一个进程信息并保存到FProcessEntry32结构体中
  202.   ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
  203.   while integer(ContinueLoop) <> 0 do //循环枚举快照中所有进程信息
  204.   begin
  205.     //找到要中止的进程名
  206.     if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeName))
  207.       or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeName))) then
  208.        TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);     //中止进程
  209.     ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32); //查找下一个符合条件进程
  210.   end;
  211. end;
  212. end.