【问题标题】:CreateFile Windows error in a Delphi THandleStreamDelphi THandleStream 中的 CreateFile Windows 错误
【发布时间】:2011-09-04 07:07:00
【问题描述】:

我有一个派生自 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;

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

这里出了什么问题,我怎样才能获得我的有效文件句柄?

【问题讨论】:

    标签: delphi winapi stream disk


    【解决方案1】:

    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]));
    ...
    

    【讨论】:

      【解决方案2】:

      对我来说,这些看起来像是有效的句柄值。是什么让您认为它们不是?

      CreateFile 不返回错误代码。如果失败,则返回 Invalid_Handle_Value。错误代码通过调用 GetLastError 给出。有关这些功能如何工作的详细信息,请参阅 MSDN 上的文档。

      如果 CreateFile 失败,我建议您通过引发异常依次使构造函数失败:

      if Hdl = Invalid_Handle_Value then
        RaiseLastOSError;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 2011-05-25
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        相关资源
        最近更新 更多