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 _
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 _
我知道是这个原因
真搞不懂 ANSI 什么鸟的用的不 是蛮好的嘛
如果用记事本,最前面要加两个字节,$FF,$FE
WriteFile(HF,S[1],Length(S)*sizeof(S[1]),BytesWritten,nil);
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
ccrun好强,我刚问了这个问题
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.
这样就可以了
谢谢 各位