Extraire miniatures vista - visual C++ - classe abstraite - appel d'une fonctio
michelscofield
Messages postés2Date d'inscriptionjeudi 1 mai 2008StatutMembreDernière intervention30 septembre 2008
-
24 sept. 2008 à 23:48
michelscofield
Messages postés2Date d'inscriptionjeudi 1 mai 2008StatutMembreDernière intervention30 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.
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");
}
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();
}
}
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.
jeffy131
Messages postés123Date d'inscriptionsamedi 14 juillet 2007StatutMembreDernière intervention29 mars 20091 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...