const
  CRLF = WideString(#13#10);
procedure THGE.System_Log(const Format: WideString; const Args: array of Const);
var
  HF: THandle;
  S: WideString;
  BytesWritten: Cardinal;
begin
  if (FLogFile = '') then
    Exit;  HF := CreateFile(PChar(FLogFile),GENERIC_WRITE,FILE_SHARE_READ,nil,
    OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  if (HF = 0) then
    Exit;
  try
    SetFilePointer(HF,0,nil,FILE_END);
    S := SysUtils.Format(Format,Args) + CRLF;
    WriteFile(HF,S[1],Length(S),BytesWritten,nil);
  finally
    CloseHandle(HF);
  end;
end;System_Log('哈哈System_Log..' + CRLF);文件内容 
萒萒S y s t e m _ 

解决方案 »

  1.   

    估计还是宽字符搞的,因为2010中char和pchar都是宽字节处理
      

  2.   

    问题是怎么处理
    我知道是这个原因
    真搞不懂  ANSI 什么鸟的用的不 是蛮好的嘛
      

  3.   

    你用什么方式看文件?
    如果用记事本,最前面要加两个字节,$FF,$FE
      

  4.   

    个人觉得IDE应该有开关可选UNICODE的,不过没找到
      

  5.   

    if Length(s) > 0 then
    WriteFile(HF,S[1],Length(S)*sizeof(S[1]),BytesWritten,nil);
      

  6.   

    如果确定用Unicode写入,创建这个文件时,先写入两个字节的文件头:$FF,$FEprocedure System_Log(const Format: WideString; const Args: array of Const);
    var
      HF: THandle;
      S: WideString;
      BytesWritten: Cardinal;
      p: array[0..1] of byte;
    begin
      if (FLogFile = '') then
        Exit;  HF := CreateFile(PChar(FLogFile), GENERIC_WRITE, FILE_SHARE_READ, nil,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  if (HF = INVALID_HANDLE_VALUE) then
      begin
        HF := CreateFile(PChar(FLogFile), GENERIC_WRITE, FILE_SHARE_READ, nil,
          CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
        p[0] := $FF;
        p[1] := $FE;
        WriteFile(HF, p, 2, BytesWritten, nil);
      end;  try
        SetFilePointer(HF, 0, nil, FILE_END);
        S := SysUtils.Format(Format,Args) + CRLF;
        WriteFile(HF, S[1], Length(S) * sizeof(S[1]), BytesWritten, nil);
      finally
        CloseHandle(HF);
      end;
    end;对于已经创建并存在的日志文件,如果前两个字节不是$FF,$FE,文件内容看起来还是乱码。在十六进制编辑器中手工加入一个文件头$FF,$FE就可以了。当然,这仅仅是一种文件头,还有其他的BOM
      

  7.   

    UP
    ccrun好强,我刚问了这个问题
      

  8.   


    unit HGELog;interface
    uses
      Windows,SysUtils;
      procedure System_Log(const S: String); overload
      procedure System_Log(const Format: String; const Args: array of Const);overload;const
      CRLF = WideString(#13#10);var
      g_LogFile:String;
    implementation
    procedure System_Log(const S: String);
    begin
      System_Log(S,[]);
    end;procedure System_Log(const Format: String; const Args: array of Const);
    var
      HF: THandle;
      S: String;
      BytesWritten: Cardinal;
      p:array[0..1]of byte;
    begin
      if (g_LogFile = '') then
        Exit;  HF := CreateFile(PChar(g_LogFile),GENERIC_WRITE,FILE_SHARE_READ,nil,
        OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
      if (HF = 0) then
        Exit;  try
        if SetFilePointer(HF,0,nil,FILE_END) = 0 then begin
          p[0] := $FF;
          p[1] := $FE;
          WriteFile(HF, p,2, BytesWritten,nil);
        end;
        S := SysUtils.Format(Format,Args) + CRLF;
        WriteFile(HF,S[1],Length(S)*sizeof(S[1]),BytesWritten,nil);
      finally
        CloseHandle(HF);
      end;
    end;
    end.
    这样就可以了
    谢谢 各位