[fpc-devel] Unicode resource strings

Anton Kavalenka anton.k at tut.by
Mon Aug 20 12:37:24 CEST 2012


On 19.08.2012 10:18, Martin Schreiber wrote:
> Hi,
> In 2008 and 2011 there were threads about FPC and Unicode resource strings
> with the conclusion that FPC does not support them.
> Are Unicode resource strings implemented in FPC now? I did not find it in
> documentation.
> Is there a replacement or supplement for
> http://wiki.freepascal.org/FPC_Unicode_support
> which answers such questions?
>
> Thanks, Martin
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
Dear FPC-all!

Since the beginning of my FPC use I maintain the following FPC/Delphi 
compatible code.

to get unicode string from resource i use

function _W(const pRec: PResStringRec):WideString;
begin
   try
     Result:=LoadResStringW(pRec);
   except
     Result:='';
   end;
end;


example of use

// this may be placed in separate includes for Delphi and FPC
{$ifdef FPC}
resourcsestring
     sSomeConstant='This is UTF-8 encoded resource string';
{$else}
resourcsestring
     sSomeConstant='This is winXXXX encoded resource string';
{$endif}

var ws:WideString;

ws:=_W(@sSomeConstant); // this is X-platform way and Delphi/FPC compatible


// FPC version of string loader
function LoadResStringW(const pRec: PResStringRec): WideString;inline;
begin
   if pRec=nil then
   Result:=''
   else
   begin
     Result:=UTF8Decode(PAnsiString(pRec)^);
   end;
end;

// Delphi version uses WinAPI call
function LoadResStringW(const pRec: PResStringRec): WideString;
var
   hInst:cardinal;
   Buffer: array [0..1023] of char;
begin^M
   if pRec = nil then Exit;

   if pRec^.Identifier < 64*1024 then
   begin
     hInst:=FindResourceHInstance(pRec^.Module^);
     // try wide
     if LoadStringW(hInst,pRec^.Identifier, @Buffer, SizeOf(Buffer))>0 then
       Result:=PWideChar(@Buffer)
     else // try narrow
     if LoadString(hInst,pRec^.Identifier, @Buffer, SizeOf(Buffer))>0 then
       Result:=PChar(@Buffer)
     else
       Result:='-lost-';
   end
   else
     Result := PWideChar(pRec^.Identifier);
end;

regards





More information about the fpc-devel mailing list