delphi delphi-2009

Convierte cadena a PAnsiChar en Delphi 2009



delphi-2009 (6)

Estoy convirtiendo mis aplicaciones a Delphi 2009 y enfrenté un problema intrigante con algunas llamadas que necesitan convertir una cadena (ancha) a AnsiString.

Aquí hay un ejemplo para demostrar el problema que estoy teniendo:

var s: PAnsiChar; ... s := PAnsiChar(Application.ExeName);

Con Delphi 2007 y versiones anteriores, s: = PChar (Application.ExeName) devolvería la ruta exe de la aplicación.

con Delphi 2009, s: = PAnsiChar (Application.ExeName) devuelve solo ''E''.

Supongo que es porque estoy convirtiendo una cadena Unicode en una cadena ansi, pero ¿cómo puedo convertirla para que un PAnsiChar obtenga la cadena completa?


La conversión explícita de Gamecat funciona. Estoy explicando el problema con más detalle a continuación para que tal vez alguien pueda señalar una mejor solución.

Estoy usando la siguiente función para recuperar la fecha de compilación de la aplicación:

function LinkerTimeStamp(const FileName: string): TDateTime; var LI: TLoadedImage; begin {$IFDEF UNICODE} Win32Check(MapAndLoad(PAnsiChar(AnsiString(FileName)), nil, @LI, False, True)); {$ELSE} Win32Check(MapAndLoad(PChar(FileName), nil, @LI, False, True)); {$ENDIF} Result := LI.FileHeader.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta; UnMapAndLoad(@LI); end;

MapAndLoad requiere un PAnsiChar para el parámetro ImageName, así que necesito convertir la cadena Unicode. ¿Hay alguna otra alternativa para convertir explícitamente a AnsiString primero?


Creo que estás un poco mal. Cada función de API Win32 tiene una contraparte Unicode, si está esperando una cadena. Pruebe MapAndLoadW en lugar de MapAndLoad ...


Tuve exactamente el mismo problema. El PAnsiChar solo apunta al primer personaje. Escribí la siguiente función para manejar la funcionalidad anterior.

// This function converts a string to a PAnsiChar // If the output is not the same, an exception is raised // Author: [email protected] function StringToPAnsiChar(stringVar : string) : PAnsiChar; Var AnsString : AnsiString; InternalError : Boolean; begin InternalError := false; Result := ''''; try if stringVar <> '''' Then begin AnsString := AnsiString(StringVar); Result := PAnsiChar(PAnsiString(AnsString)); end; Except InternalError := true; end; if InternalError or (String(Result) <> stringVar) then begin Raise Exception.Create(''Conversion from string to PAnsiChar failed!''); end; end;


En lugar de usar Type String , use RawByteString :

s: RawByteString; s := LoadSomeRegularString(usually a string type); PAnsiChar(s) <<< all fine.


No tengo Delphi 2009 aquí, así que no puedo verificarlo. Pero tal vez tienes que intentar:

s := PAnsiChar(AnsiString(Application.ExeName));

Como ya ha señalado gabr, esta no es una buena práctica, y solo la usarás si estás 100% seguro. La cadena solo contiene caracteres que tienen una asignación directa al rango ANSI.

Es por eso que debería recibir una advertencia porque está convirtiendo Unicode en ANSI.