Inno Setup LoadStringFromFile fails when file is open in another process

后端 未结 2 926
借酒劲吻你
借酒劲吻你 2020-12-20 02:25

To check to see when a database (SQL Anywhere) is fired up and ready to receive requests I am outputting the database message window to a log (text) file and then attempting

相关标签:
2条回答
  • 2020-12-20 03:00

    Use the TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone).

    In Unicode version of Inno Setup (the only version as of Inno Setup 6), its use is tricky due to a bad interface of the class.

    function BufferToAnsi(const Buffer: string): AnsiString;
    var
      W: Word;
      I: Integer;
    begin
      SetLength(Result, Length(Buffer) * 2);
      for I := 1 to Length(Buffer) do
      begin
        W := Ord(Buffer[I]);
        Result[(I * 2)] := Chr(W shr 8); { high byte }
        Result[(I * 2) - 1] := Chr(Byte(W)); { low byte }
      end;
    end;
    
    function LoadStringFromLockedFile(const FileName: string; var S: AnsiString): Boolean;
    var
      Buffer: string;
      Stream: TFileStream;
    begin
      Result := True;
      try
        Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
        try
          SetLength(Buffer, Stream.Size div 2);
          Stream.ReadBuffer(Buffer, Stream.Size);
          S := BufferToAnsi(Buffer);
        finally
          Stream.Free;
        end;
      except
        Result := False;
      end;
    end;
    

    The code is based on TLama's code posted in Read bytes from file at desired position with Inno Setup.

    0 讨论(0)
  • 2020-12-20 03:02

    When spawning the database server, use the dbspawn utility, which is designed for this purpose. You spawn dbspawn along with the dbeng/dbsrv command you want to run, and it starts the server for you. The dbspawn utility doesn't return until the database server is up, running, and ready to accept requests, so there's no guesswork needed and no need to read the console log file.

    I don't know what version of SQL Anywhere you're running, but here is the documentation for v17. It should be the same in any other version.

    0 讨论(0)
提交回复
热议问题