Delphi在Windows 7 64上使用LockFile

时间:2010-09-24 02:54:10

标签: delphi winapi locking win64 lockfile

我发现如果您从64位Windows 7计算机上打开位于共享文件夹中的32位服务器上的文件,请将其读取,锁定然后再次打开。当您关闭所有打开的句柄时,文件实际上保持打开状态。

具体步骤如下:

  1. 在32位Windows计算机上的共享文件夹中放置长度介于7000和10000之间的文件,我们使用的是Windows Server 2003。

  2. 为Win32编译以下代码,使其在WOW64下运行。请注意,为了简单起见,我错过了try..finally,声明等 (请参阅下面的代码片段; StackOverflow错误在列表中没有正确格式化代码)

  3. 在64位Windows计算机上运行该应用程序。该文件必须位于32位机器上,我们使用的是Windows Server 2003,如果该文件位于64位服务器上,则不会出现该错误。

  4. 终止您的申请。

  5. 如果您现在打开服务器上的计算机管理器(控制面板 - >计算机管理)并查看文件所在的共享文件夹中打开的文件,您将看到您的文件仍处于打开状态。

  6. 这是代码:

    procedure CauseFileLockBug(FileName: PChar);
    var
      FileHandle1: LongInt;
      FileHandle2: LongInt;
      Buffer: Pointer;
      BytesRead: Cardinal;
    begin
      FileHandle1 := CreateFile(
        FileName, 
        GENERIC_READ or GENERIC_WRITE, 
        FILE_SHARE_READ or FILE_SHARE_WRITE, 
        nil, 
        OPEN_EXISTING, 
        FILE_FLAG_RANDOM_ACCESS, 
        0);
    
      if FileHandle1 > 0 then
      begin
        try
          GetMem(Buffer, 1);
    
          try
            if ReadFile(FileHandle1, Buffer^, 1, BytesRead, nil) then
            begin
              if LockFile(FileHandle1, 6217, 0, 1, 0) then
              begin
                try
                  FileHandle2 := CreateFile(
                    FileName, 
                    GENERIC_READ or GENERIC_WRITE, 
                    FILE_SHARE_READ or FILE_SHARE_WRITE, 
                    nil, 
                    OPEN_EXISTING, 
                    FILE_FLAG_RANDOM_ACCESS, 
                    0);
    
                  if FileHandle2 > 0 then
                  begin
                    CloseHandle(FileHandle2);
                  end;
                finally
                  UnLockFile(FileHandle1, 6217, 0, 1, 0);
                end;
              end;
            end;
          finally
            FreeMem(Buffer);
          end;
        finally
          CloseHandle(FileHandle1);
        end;
      end;
    end;
    

    如果在第二次打开文件时使用FILE_FLAG_NO_BUFFERING标志,或者在锁定文件之前没有读取文件,则不会出现问题。

    有没有人注意到这一点或知道如何解决它,而不使用FILE_FLAG_NO_BUFFERING?请注意,只有当64位Windows客户端在32位Windows机器上以这种方式打开文件时才会发生这种情况,不会发生32位或64位到64位。

1 个答案:

答案 0 :(得分:0)

好的问题解决了。

似乎Nod32 x64导致了这个问题。使用通配符*将所有可能的路径添加到文件夹(所有网络路径和映射的驱动器)到排除列表,然后重新启动PC已修复它。

无论如何,谢谢你的帮助。