Delphi THandleStream中的CreateFile Windows错误

az0*_*z01 3 delphi winapi disk stream

我有一个从THandleStream派生的简单类,我用它来编辑原始卷.我调用Windows createfile()函数来打开一个驱动器,但该函数永远不会返回一个有效的句柄,而是一个奇特的错误代码(在调试时间为348,在运行时为304,但是没有引发错误,这只是句柄值看起来很奇怪).这就是我正在做的事情:

Constructor TDiskStream.Create(Const aDrive: String);
Var
  Hdl: Cardinal;
  A,B: Int64;
Begin

  Hdl := CreateFile( PChar(ADrive), 
                     GENERIC_WRITE, 
                     FILE_SHARE_READ Or FILE_SHARE_WRITE, 
                     0, OPEN_EXISTING, 0, 0);

  Inherited Create( Hdl );
  GetDiskFreeSpaceEx( PChar( RightStr(ADrive,2) + '\'), A, FSize, @B );

End;
Run Code Online (Sandbox Code Playgroud)

句柄值与msdn上描述为ERROR_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING的错误代码匹配,但它似乎非常罕见.所述aDrive参数设置是否正确(在格式\\ \×: ).

这里有什么问题,我怎样才能设法获得有效的文件处理?

klu*_*udg 10

CreateFile不返回错误代码 - 它返回有效句柄或INVALID_HANDLE_VALUE(-1).以下是CreateFile带错误检查的函数调用的标准用法:

var
  H: THandle;

begin
  H:= CreateFile(PChar('\\.\D:'), GENERIC_READ,
    FILE_SHARE_WRITE or FILE_SHARE_READ, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if H = INVALID_HANDLE_VALUE then
    raise Exception.Create(Format('Oops - error opening disk: %d', [GetLastError]));
...
Run Code Online (Sandbox Code Playgroud)