OVH Cloud OVH Cloud

wchar_t et L"chaine"

2 réponses
Avatar
Phil
Bonjour

J'aimerais connaître les imension d'une image jpg. Pour cela je m'inspir
e de l'exemple donné dans msdn :
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>

using namespace Gdiplus;

INT main(){
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

Image* image = new Image(L"a.jpg");
SizeF size;
image->GetPhysicalDimension(&size);
printf("largeur=%f\n", size.Width);
printf("hauteur=%f\n", size.Height);

delete image;
GdiplusShutdown(gdiplusToken);
return 0;
}

Ca fonctionne bien. Le problème est quand je passe le nom du fichier en
paramètre. Sauf erreur, L"chaine" indique que la chaîne "chaine" doit êt
re lue en tant que wchar_t. Mais quand je fais le cast, ça ne marche pas
Pas d'erreur à la compilation, mais à l'exécution, les dimensions reto
urnent systématiquement 0 et 0.
Quelqu'un a un exemple ?

Voici mon code modifié :
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
#include <string.h>

using namespace Gdiplus;

INT main(int argc, char **argv){
//WCHAR fichier_image[256]; // erreur de compil
wchar_t fichier_image[256];
//char fichier_image[256]; // ne fonctionne pas

if (argc < 2) {
puts("syntaxe : get_dim_jpg nom_de_la_jpg");
return -1;
}
strcpy((char *)fichier_image, argv[1]);
//wcscpy(fichier_image, argv[1]); // erreur de compil
printf("nom du fichier : %s\n", fichier_image);
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

//Image* image = new Image(L"a.jpg");
Image* image = new Image((wchar_t*)fichier_image);
SizeF size;
image->GetPhysicalDimension(&size);
printf("largeur=%f\n", size.Width);
printf("hauteur=%f\n", size.Height);

delete image;
GdiplusShutdown(gdiplusToken);
return 0;
}


Merci

Phil

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Article poste via Voila News - http://www.news.voila.fr
Le : Tue Dec 23 10:41:56 2003 depuis l'IP : 213.11.63.177 [VIP 4643310]

2 réponses

Avatar
kanze
Phil wrote in message
news:<bs92l4$bur$...

J'aimerais connaître les imension d'une image jpg. Pour cela je
m'inspir e de l'exemple donné dans msdn :


Ça aurait été plus facile à t'aider si tu avais ôté toute la partie qui
n'a rien à voir avec ton problème. En attendant, je serais très étonné
si on n'a pas des cris « hors sujet », à cause des requêtes MS et
d'autres.

[...]

Le problème est quand je passe le nom du fichier en paramètre. Sauf
erreur, L"chaine" indique que la chaîne "chaine" doit êt re lue en
tant que wchar_t.


Tout à fait.

Mais quand je fais le cast, ça ne marche pas Pas d'erreur à la
compilation, mais à l'exécution, les dimensions reto urnent
systématiquement 0 et 0. Quelqu'un a un exemple ?

Voici mon code modifié :
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
#include <string.h>

using namespace Gdiplus;

INT main(int argc, char **argv){
//WCHAR fichier_image[256]; // erreur de compil
wchar_t fichier_image[256];
//char fichier_image[256]; // ne fonctionne pas

if (argc < 2) {
puts("syntaxe : get_dim_jpg nom_de_la_jpg");
return -1;
}
strcpy((char *)fichier_image, argv[1]);
//wcscpy(fichier_image, argv[1]); // erreur de compil


L'un et l'autre de ces fonctions exigent deux pointeurs du même type.
Dans le premier cas, tu as fait taire le compilateur en lui mentant --
fichier_image n'est pas un char* (ni un char[]). En général, quand tu
mens aux compilateur, il prend sa revanche.

printf("nom du fichier : %sn", fichier_image);


Ce qui est encore une preuve que fichier_image ne contient pas le nom du
fichier sur des wchar_t. Les octets de fichier_image contient bien le
nom du fichier sur des char, mais ce n'est pas du tout la même chose.

Ce qu'il te faut, c'est réelement une conversion de code, et non
simplement un rénommage du type. En C, les fonctions de conversion de
code s'appellent mbstowcs et wcstombs. En C++, il faudrait régarder du
côté de std::codecvt, mais c'est assez lourd à l'utilisation. Dans les
deux cas, il faudrait en principe régarder du côté des locales pour voir
ce qu'il te faut, mais dans la pratique, si ton nom de fichier ne
contient que des caractères de base (pas d'accents), le locale par
défaut doit probablement marcher.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
Fabien LE LEZ
On 23 Dec 2003 06:22:37 -0800, wrote:

En attendant, je serais très étonné
si on n'a pas des cris « hors sujet »


J'ai vu <windows.h>, j'ai pas eu le courage de lire la suite pour
savoir si oui ou non je pouvais hurler ;-)

--
;-)