Intercambio de cadenas (PChar) entre una DLL compilada de Freepascal y un EXE compilado de Delphi

Después de muchos experimentos, encontré una manera de intercambiar PChar desde una DLL compilada por FreePascal con un EXE compilado por Delphi. Estoy a cargo del código fuente DLL y EXE, pero uno DEBE ESTAR en FreePascal y el otro en Delphi. Mi solución involucra los siguientes métodos en la DLL:

function GetAString(): PChar;
var aString: string;
begin
  aString := 'My String';
  result := StrAlloc(length(aString) + 1);
  StrPCopy(result, aString); 
end;

procedure FreeString(aString: PChar);
begin
  StrDispose(aString); 
end;

Y desde el Delphi EXE, para llamar al método GetAString, necesito llamar al método GetAString, guardar el PChar en una cadena Delphi real y llamar al método FreeString.

¿Es esta la mejor manera de intercambiar una cadena de una DLL de FreePascal con un EXE de Delphi? ¿Puedo evitar la llamada a FreeString desde Delphi?

Y finalmente, si esa es la solución correcta, ¿cómo se comportará con Delphi 2010 y WideString de forma predeterminada: ¿necesito forzar WidePChar también en FreePascal?

Respuestas a la pregunta(1)

Su respuesta a la pregunta