Extraire miniatures vista - visual C++ - classe abstraite - appel d'une fonctio

michelscofield Messages postés 2 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 30 septembre 2008 - 24 sept. 2008 à 23:48
michelscofield Messages postés 2 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 30 septembre 2008 - 30 sept. 2008 à 16:58
    /*
Bonjour à tous,
J'ai quelques problèmes sur ce petit programme console pour vista, nottament au niveau de Programmation objet...

Programme en console en c++ qui sauvegarde une copie de la miniature d'un fichier crée par l'explorateur de vista. (travaux sous visual c++ 2008 - ceci est une source utilisable)

Le programme consiste à
- "ouvrir" un fichier              //ça a l'air de marcher deja
- récupérer la miniature      // je n'arrive pas a creer un nouvel objet IThumbnailCache avec new ou bien appeller la fonction directement par IThumbnailCache::GetThumbnail(); Ici j'ai un pointeur et n'arrive pas à l'initialiser. J'ai fait que du C mais tres peu d'objet avec C++ et java, je ne sais pas quoi faire pour appeller correctement la fonction dans ce contexte.
- save as .bmp//je n'ai pas pu vérifier cette fonction toute faite, (trouvée sur http://sarathc.wordpress.com/2007/03/14/how-to-save-bitmap-to-file/) Je pense que  le ISharedBitmap peut etre ecrit ainsi dans un fichier bmp.

Ceci est la source du fichier.

Merci de votre aide !
michielscofield
*/

#include "stdafx.h"
#include <shobjidl.h>//shell item
#include <thumbcache.h>//thumbnail
#include <windows.h>
#include <stdio.h>
using namespace System;

int SaveBitmapToFile( BYTE* pBitmapBits, LONG lWidth, LONG lHeight,WORD wBitsPerPixel, LPCTSTR lpszFileName );

int main(array<System::String ^> ^args)
{
    //creer un Item de pic.bmp
   HRESULT res;
   IShellItem *psi;
   res = SHCreateItemFromParsingName(L"C:\\Users\\pascal\\Documents\\Visual Studio 2008\\Projects\\test console\\pic.bmp", NULL, IID_PPV_ARGS(&psi));if (res!=S_OK)
   if (res!=S_OK)   
   {
              printf("error : SHCreateItemFromParsingName");
                return EXIT_FAILURE;
    }
  
//recuperer la thumbnail (miniature)
 ISharedBitmap *ppvThumb;
 WTS_CACHEFLAGS pOutFlags;
 WTS_THUMBNAILID pThumbnailID;
 
//plante à partir d'ici
 IThumbnailCache *T;
 res=IThumbnailCache::GetThumbnail(psi,128,WTS_FORCEEXTRACTION,&ppvThumb,&pOutFlags,&pThumbnailID );//|WTS_EXTRACTDONOTCACHE too?
 
 if (res!=S_OK)   
    {       
              printf("error : GetThumbnail");
                return EXIT_FAILURE;
    }
 if (pOutFlags==WTS_LOWQUALITY)
        printf("warning : Low quality");

//sauvegarde (fonction plus bas)
res=SaveBitmapToFile( (BYTE)(ppvThumb),64,64,24, L"C:\\Users\\pascal\\Documents\\Visual Studio 2008\\Projects\\test console\\thumb_pic.bmp");
 if (res!=0)
   {
              printf("error : Save");
   }

    return EXIT_SUCCESS;
}

int SaveBitmapToFile( BYTE* pBitmapBits, LONG lWidth, LONG lHeight,WORD wBitsPerPixel, LPCTSTR lpszFileName )
{
Source de cette fonction :
voir
http://sarathc.wordpress.com/2007/03/14/how-to-save-bitmap-to-file/
}

3 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
25 sept. 2008 à 13:03
Salut,

Je n'ai pas Vista ici , et je ne connais pas thumbcache.h. Cependant...





<hr />

 IThumbnailCache *T;
 res=IThumbnailCache::GetThumbnail(psi,128,WTS_FORCEEXTRACTION,&ppvThumb,&pOutFlags,&pThumbnailID );//|WTS_EXTRACTDONOTCACHE too?







<hr />

Ici, tu déclare un pointeur sur un IThumbnailCache, puis tu ne t'en sert pas. Ensuite, tu semble chercher à accèder à la méthode GetThumbnail comme si elle était statique.

Plus que du C++, c'est du COM dont il s'agit ici. IThumbnailCache correspond à une interface. Il faut que tu instancie un objet qui implémente cette interface. Pour cela, il faut en faut que tu fasses comme ça, mais avec ton interface. Ca doit donner quelque chose comme ça :







<hr />

IThumbnailCache *t;
HRESULT res;// Initialisation de COM si ce n'est déjà fait
res = CoInitialize(NULL);

if (SUCCEEDED(res))
{
   
    res = CoCreateInstance(CLSID_ThumbnailCache, NULL, CLSCTX_INPROC_SERVER, IID_IThumbnailCache, (void**)&t);
   
    if (SUCCEEDED(res))
    {
        // Décrémentation du compteur de référence pour libération
        t->Release();
    }
}

<hr />Pour le CLSCTX, j'ai un doute.

Ca va mettre quelque chose au bout de ton pointeur. En plus d'implémenter IThumbnailCache, l'objet instancier implémente IUnknown. IUnknown gère un compteur de référence. Il faut l'incrémenté lorsque l'on met un nouveau pointeur sur l'objet, et le décrémenter lorsque l'un de ces pointeurs disparait. Quand il n'y a plus de pointeur sur l'objet, Release libère l'objet. C'est un mécanisme supposer aider à libérer un objet au bon moment tout en offrant la possibilité d'avoir un grand nombre de pointeurs dessus.
0
jeffy131 Messages postés 123 Date d'inscription samedi 14 juillet 2007 Statut Membre Dernière intervention 29 mars 2009 1
25 sept. 2008 à 15:50
Ce n'est pas du tout IThumbnailCache pour extraire les thumbnails
Ca a été donné maintes fois depuis XP sur tous les ng de programmation Win32 pros
 (comp.os.ms-windows.programmer.win32, microsoft.public.platformsdk.shell,
fr.comp.os.ms-windows.programmation, etc)
Et ça se sauvegarde en JPG ou GIF, pas BMP à cause de la taille...
0
michelscofield Messages postés 2 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 30 septembre 2008
30 sept. 2008 à 16:58
Merci à tous pour ce rappel sur la programmation COM et aussi pour la piste des News.
Je vais m'abonner de ce pas...bonne continuation !

michelscofield.
0
Rejoignez-nous