Unicode problèmes avec Delphi 2009 / 2010 et les appels d'API de windows
Salut j'ai été en utilisant cette fonction en Delphi 2006, mais maintenant, avec D2010 il renvoie une erreur.
Je pense que c'est lié à l'interrupteur de l'Unicode.
Function TWinUtils.GetTempFile(Const Extension: STRING): STRING;
Var
Buffer: ARRAY [0 .. MAX_PATH] OF char;
Begin
Repeat
GetTempPath(SizeOf(Buffer) - 1, Buffer);
GetTempFileName(Buffer, '~~', 0, Buffer);
Result := ChangeFileExt(Buffer, Extension);
Until not FileExists(Result);
End;
Que dois-je faire pour le faire fonctionner?
MODIFIER
- Je obtenir une "violation d'accès" lorsque le ChangeFileExt est appelé
- vous devez éditer votre question pour inclure le message d'erreur (une bonne habitude - logique, non?)
- Veuillez consulter le lien suivant pour une discussion du problème (presque le même code) et une meilleure version qui prend en compte un peu plus de ce que la documentation de l'API dit concernant la taille maximale de mémoire tampon. forums.embarcadero.com/thread.jspa?threadID=18246
Vous devez vous connecter pour publier un commentaire.
Windows.Pas
SysUtils.Pas
Essayer cette
ou ce
Pour Delphi, Char et PChar types sont WideChar et PWideChar types, respectivement.
Si vous utilisez l'un de l'API de Windows qui renvoient des données en char tampons les tampons doivent être redéclarée que des tableaux d'octets ou un tableau de AnsiChar.
Si vous appelez ces de l'API de Windows et l'envoi dans les tampons, si l'ont été à l'aide de la fonction sizeof quand raconter l'API combien de temps votre tampon est. Ces appels doivent être modifiées pour la Durée de la fonction, comme Windows widechar API exiger que le nombre de caractères, et non pas le nombre d'octets.
Bye.
WideChar
. Il n'y a pas deUnicodeChar
type, et ne l'a jamais été.Avec Delphi 2009, Le Char est un char unicode. La fonction nécessite probablement un tableau de AnsiChar.
Viens de vérifier il. Les deux GetTempFilename et GetTempPath besoin d'un PWideString.
Quel est le message d'erreur?
PWideChar
?PWideString
est tout autre chose.Je vous recommande de toujours, et je veux vraiment dire toujours, jetez un oeil dans les docs sur l'exacte des attentes de chaque fonction de l'API concernant la dwSize paramètre et/ou la valeur de retour.
Malheureusement il y a beaucoup de cas différents, donc il suffit de dire "toutes les fonctions de chaîne de besoin/retourne le nombre de caractères" n'est pas tout à fait correct et peut envoyer le lecteur dans un cauchemar sporadiques de pointeur invalide AVs.
ne le faites pas.
non-nul pointeur est passé.
Toutes ces choses peuvent être trouvés dans les docs facilement, mais il faut le lire. Vraiment. Il peut vous épargner des heures.
Utilisation
GetTempPathA
etGetTempFileNameA
, la version Ansi deGetTempPath
etGetTempFileName
. Ils sont toujours disponibles dans Delphi 2009, et mentionné dans le Delphi 2009 fichier d'aide, mais ils ne sont pas annoncés.