Delphi 备忘五

1.  Variant和Stream的互换

 

procedure VarToStream(var AStm: TStream; var AOvar: Olevariant);
var
  p: Pointer;
begin
  AStm:= TMemoryStream.Create;
  AStm.Position := 0;
  p := VarArrayLock(AOvar);
  AStm.Write(p^, VarArrayHighBound(AOvar, 1));
  VarArrayUnlock(AOvar);
end;

procedure StreamToVar(var AStm: TStream; var AOvar: Olevariant);
var
    p: Pointer;
begin
  AOvar := VarArrayCreate([0, AStm.Size - 1], VarByte);
  p := VarArrayLock(AOvar);
  AStm.ReadBuffer(p^, AStm.Size);
  VarArrayUnlock(AOvar);
end;

 

2. 判断文件是否在用

{createfile里面的第三个参数为dwShareMode ,使用如下(详见createfile的API)
[in] The sharing mode of an object, which can be read, write, both, or none. 
You cannot request a sharing mode that conflicts with the access mode that is specified in an open request that has an open handle, because that would result in the following sharing violation: ERROR_SHARING_VIOLATION). For more information, see Creating and Opening Files.

If this parameter is 0 (zero) and CreateFile succeeds, the object cannot be shared and cannot be opened again until the handle is closed. For more information, see the Remarks section of this topic.

} 

function IsFileInUse(const AFileName: string): Boolean;
var
  HFileRes: HFILE;
begin
  Result :
= false;
  
if not FileExists(AFileName) then //如果文件不存在
    exit;
  HFileRes :
= CreateFile(pchar(AFileName), GENERIC_READ or GENERIC_WRITE,
    
0 {this is the trick!}nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Result :
= (HFileRes = INVALID_HANDLE_VALUE);
  
if not Result then
    CloseHandle(HFileRes);
end;

 

 

posted @ 2011-05-13 17:08  Enli  阅读(306)  评论(0编辑  收藏  举报