function FormatEx(const AFormatStr: string; AParams: array of const): PChar;
var
MssageBuf: PChar;
MssageParam: PDWORDArray;
i, Len: Integer;
begin
try
Result := nil;
MssageParam := nil;
if AFormatStr = '' then Exit;
Len := Length(AParams);
if Len > 0 then
begin
MssageBuf := Windows.HeapAlloc(Windows.GetProcessHeap, Const_HEAP_PTR, 1024);
if MssageBuf = nil then Exit;
MssageParam := Windows.HeapAlloc(Windows.GetProcessHeap, Const_HEAP_PTR, (Len * Sizeof(DWORD)));
try
if MssageParam = nil then Exit;
for i := Low(AParams) to High(AParams) do
if AParams[i].VType = vtString then
MssageParam^[i] := DWORD(PChar(DWORD(AParams[i].VString) + 1))
else
MssageParam^[i] := DWORD(AParams[i].VInteger);
Len := Windows.wvsprintf(MssageBuf, PChar(AFormatStr), PChar(MssageParam));
MssageBuf[Len] := Char($0);
finally
if MssageParam <> nil then
Windows.HeapFree(Windows.GetProcessHeap, 0, MssageParam);
end;
Result := PChar(MssageBuf);
end
else
Result := PChar(AFormatStr);
except
on E: Exception do
begin
showmessage( E.Message);
end;
end;
end;