Bonjour
j'aimerai savoir si il existe un moyen de gérer les thumbnail en C.
J'ai trouvé sur la Msdn des méthodes en C++ tel que GetThumbnail...mais rien en C.
Merci
Bonjour
j'aimerai savoir si il existe un moyen de gérer les thumbnail en C.
J'ai trouvé sur la Msdn des méthodes en C++ tel que GetThumbnail...mais rien en C.
Merci
Bonjour,
La question qui se pose est : "Qu'est ce que vous entendez pas 'thumbnails'"
Un thumbnails, c'est une minuature (comme la miniature que l'on peut voir dans les navigateurs de fichiers). Pour en faire une, il soucis d'utiliser un programme (ou une bibliothèque) pour redimensionner l'image (Image Magic est désigné pour ce genre de truc).
Donc, que voulez vous vraiment faire ?
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
Le GetThumbnail de GDI+ (qui normalement devrait être utilisable en C avec la GDI+ Flat API) ne fait pas que redimensionner l'image: Si l'image contient déjà elle-même une miniature (c'est le cas de certains JPEG, il me semble), la fonction va l'extraire au lieu d'en créer une nouvelle.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Donc en fait je developpe une application C windows qui gère des fichiers présent sur le DD.
Et je voudrait afficher une miniature de mon fichier dans mon outils ...
le thumbnail ne s'applique pas qu'au fichier image mais aussi pdf, xls, doc ...
Dans ce cas, c'est du côté des extensions du shell qu'il faut se tourner.
Il faut connaître un minimum les principes de COM, mais une fois ça en tête un petit GetUIObjectOfFile en demandant l'interface IThumbnailProvider devrait être un bon départ.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Bonjour
et tout d'abord merci pour votre aide qi m'a déjà permis de bien avancer!!!
Aujourd'hui j'arrive a récupérer des HBITMAP a partir de mes fichiers.
Et donc à afficher des Thumbnails.
Cependant dans le cas ou les fichiers ne supportent pas le format thumbnail je souhaite récupérer l'icone ... et la il y a un crash.
voici le code
La ligne rouge me renvoie l'erreur suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 IExtractIconA * lf_get_icon(IShellFolder *isf_folder, LPITEMIDLIST *pidl_file) { IExtractIconA *ii_file = NULL; if (pidl_file != NULL) { int prgf = 0; isf_folder->lpVtbl->GetUIObjectOf(isf_folder, NULL, 1, pidl_file, &IID_IExtractIcon, &prgf, &ii_file); } if(ii_file == NULL) { isf_folder->lpVtbl->CreateViewObject(isf_folder, NULL, &IID_IExtractIcon, &ii_file); } return ii_file; } HBITMAP lf_extract_icon(IShellFolder *isf_folder, LPITEMIDLIST *pidl_file, BYTE * paz_path , int i_path_size, int dwCX, int dwCY) { int i_flags = (int)(GIL_DEFAULTICON|GIL_FORSHELL) ; int i_index = 0; // BYTE az_path[MAX_PATH] = ""; HBITMAP h_bmp_res = NULL; HICON phc_IconLarge = NULL; HICON phc_IconSmall = NULL; ICONINFO iconInfo; IExtractIconA *ii_file=NULL; SHFILEINFO shgfi ; //get icon ii_file = lf_get_icon(isf_folder, pidl_file); if (ii_file != NULL) { //HICON extract ii_file->lpVtbl->GetIconLocation(ii_file, 0, az_path, sizeof(az_path), &i_index, &i_flags); ii_file->lpVtbl->Extract(ii_file, az_path, sizeof(az_path), &phc_IconLarge, &phc_IconSmall, dwCX + 65536 * dwCX); (...) } else { (...) } //free all (...) return h_bmp_res; }
si quelqu'un a une idée....Unhandled exception at 0x7533C4EC (shlwapi.dll) in Win32Project2.exe: 0xC0000005: Access violation reading location 0x00000000.
Je suppose que tu vérifies aussi que isf_folder n'est pas nul?
De plus, si tu demandes une IExtractIconA, tu dois passer spécifiquement IID_IExtractIconA aux fonctions du shell.
Au passage: Ne te contente pas de tester le pointeur retourné: Tu dois avant tout tester le HRESULT (avec les macros SUCCEEDED() et FAILED()) retourné par la fonction, car certaines fonctions répondent n'importe quoi quand elles échouent!
Aussi, ton paramètre pidl_file, tu devrais l'appeler ppidl_file pour éviter la confusion.
Ou mieux, tu devrais passer juste un PCUITEMID et utiliser son adresse dans ta fonction, c'est plus simple.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Bonjour,
Voici un nouveau problème.
Tout est Ok quand je lance mon programme sous Windows 7
par contre sous XP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 IExtractImage *hbitmap_get_thumbnail(IShellFolder *isf_folder, LPITEMIDLIST *pidl_file) { IExtractImage *ie_file = NULL; if (pidl_file != NULL) {//extract from file int i_prgf = 0; isf_folder->lpVtbl->GetUIObjectOf(isf_folder, NULL, 1, pidl_file, &IID_IExtractImage, &i_prgf, &ie_file); } if(ie_file == NULL) {//Extract from folder isf_folder->lpVtbl->CreateViewObject(isf_folder, NULL, &IID_IExtractImage , &ie_file); } return ie_file; }retourn en GetLastError la valeur 126 = ERROR_MOD_NOT_FOUND...
Code : Sélectionner tout - Visualiser dans une fenêtre à part isf_folder->lpVtbl->GetUIObjectOf(isf_folder, NULL, 1, pidl_file, &IID_IExtractImage, &i_prgf, &ie_file);
Cependant d'après la MSDN IID_IExtractImage
Si vous avez une idée pour faire fonctionner cela sous Win XP (90 % de mes clients :p) merci.Minimum supported client: Windows 2000 Professional, Windows XP
GetLastError n'est pas approprié pour l'utilisation de méthodes COM: C'est le HRESULT qu'il faut voir (et si son mot de poids fort est 0x8007, alors le mot de poids faible est une erreur Win32).
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Stupide !!!!!!
Je suis stupide
ta réponse est parfaite:
j'ai donc regardé le HRESULT et il commence par 0x8004.GetLastError n'est pas approprié pour l'utilisation de méthodes COM: C'est le HRESULT qu'il faut voir (et si son mot de poids fort est 0x8007, alors le mot de poids faible est une erreur Win32).
cependant c'est le début de ta réponse qui est intéressante
question: Que fait on lorsque l'on utilise les methodes COM!!!!!!GetLastError n'est pas approprié pour l'utilisation de méthodes COM
on INITIALISE aves CoInitialize(NULL);
..
Je clos le sujet si quelqu un souhaite plus d'info sur les thumbnail en C qu'il me contact.
MERCI de votre aide.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager