Hbitmap d'une jpg

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 5 avril 2007 à 14:27
 vecchio56 - 6 avril 2007 à 18:54
Yop à tous,

Voila je veu obtenir un hbitmap d'un fichier jpg, pour cela j'ai trouver la source de vecchio56 à savoir :http://www.cppfrance.com/codes/IMAGES-JPG-GIF-SANS-LIBRAIRIE-EXTERNE-WIN32_35231.aspx

Malheureusement je n'arrive pas à l'intégrer à mon programme. J'ai les erreurs suivante aussi bien sous dev-cpp que sous VC++ 2005.

- stream->release(); : stream n'a pas de membre release , cela pour toute les lignes qui contient cette instruction.
- IDD_Ipicture non déclarer .

Quelqu'un put-il me dire d'où vient cette erreur ?

Merci d'avance.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]

25 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
5 avril 2007 à 15:11
Il est possible que selon ta config projet win32 :

1 : Il ne faut pas mettre le #define win32_lean_and_mean
2 :  Ou alors, il faut inclure : #include

Sinon je ne vois pas autre chose...
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
5 avril 2007 à 15:13
Au fait il faut une majuscule :
stream->Release();
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
5 avril 2007 à 15:15
Majuscule ici aussi :
IID_IPicture
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 avril 2007 à 15:26
Non aucune des deux solution fonctionne, d'ailleur je n'ai jamais eu de #define win32_lean_and_mean. J'ai trouver IDD_IPicture dans le fichier olectlid.h qui est include dans olectl.h donc je ne comprend pas pourquoi il me dit qu'il n'est pas défini :s

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 avril 2007 à 15:54
Salut,
Pour utiliser l'interface IPicture, deux includes suffisent:
#include <windows.h>
#include <olectl.h>

L'identificateur de l'interface est IID_IPicture.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 avril 2007 à 15:58
Oui entièrement daccord avec vous, mais cela ne fonctionne pas. Pas moyen d'introduire ces fonction dans mon projet.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 avril 2007 à 16:05
oui IID je m'était tromper dans la réponse :D .
++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 avril 2007 à 16:20
J'ai souvent utilisé IPicture avec Visual C/C++ 6 sans problème. Je viens de coller un ancien code sur un projet Visual C/C++ 2005 Express et ça marche. Essaie de faire un nouveau projet et tester avec le minimum de code.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 avril 2007 à 16:33
Ben je vien de tester l projet de vecchio56 et cela fonctionne. Mais je ne voi absolument pas ce qui diffère avec les paramètre de mon projet.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 avril 2007 à 16:40
Normalement, ça doit fonctionner avec les paramètres par défaut.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 avril 2007 à 17:09
je vien de tester avec un projet par défaut et le minimum de code et cava, je ne comprend vraiment pas, j'apas changé les propriétés. bizzare.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
5 avril 2007 à 20:08
Essaie ceci, et n'oublie pas d'ajouter dans le linkage ces 3 fichiers:
libuuid.a , libolepro32.a , libole32.a

#include <windows.h>
#include <olectl.h>
#include <ole2.h>

HBITMAP LoadAnImage(char* lpFileName)
{
    HBITMAP hbmp = NULL;
    HANDLE hFile;
    DWORD dwFileSize, dwRead;
    HGLOBAL hgbl;
    char * pmem;
    HRESULT hr;
   
    hFile = CreateFile(lpFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    if(hFile == INVALID_HANDLE_VALUE)
        return NULL;
   
    dwFileSize = GetFileSize(hFile, 0);
    hgbl =(HGLOBAL)GlobalAlloc(GMEM_FIXED, dwFileSize);
   
    if(ReadFile(hFile, hgbl, dwFileSize, &dwRead, 0) && dwRead == dwFileSize)
    {
        CoInitialize(NULL);
        IStream* stream;
        hr = CreateStreamOnHGlobal(hgbl, TRUE, &stream);
        if(SUCCEEDED(hr) && stream)
        {
            IPicture* picture;
            hr = OleLoadPicture(stream, dwFileSize, 0, IID_IPicture, (void**)&picture);
            if(SUCCEEDED(hr) && picture)
            {
                HBITMAP hsrc;
                picture->get_Handle((OLE_HANDLE *)&hsrc);
                hbmp = (HBITMAP)CopyImage(hsrc, IMAGE_BITMAP, 0, 0, 0);
                picture->Release();
            }
            stream->Release();
        }
        CoUninitialize();
    }
   
    GlobalFree(hgbl);
    CloseHandle(hFile);
   
    return hbmp;
}
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
6 avril 2007 à 00:15
moi j'ai l'erreur dans PictureToBitmap :
initialization of 'picture' is skipped by 'goto errPicture'


dommage, je gagnerais en place plutot que la jpglib
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
6 avril 2007 à 00:46
bon, j'ai plus l'erreur en modifiant un peu le source, mais ça plante lamentablement avec une image en resource
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 avril 2007 à 11:10
Merci Gagah1 : j'esseye ça et je tien au courant.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 avril 2007 à 12:42
Non cela ne va pas, j'ai exactement les mm erreur. C'est tout de même bien du C et non du C++ ?

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
6 avril 2007 à 13:00
Le code de gagah1 est en C++. En C, pour appeler les méthodes d'une interface, il faut passer par la VTable.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 avril 2007 à 16:41
Nous y voila , je compile en C, je me disait aussi que stream->Release(); n'était pas du C. La VTable c'est quoi?

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
6 avril 2007 à 16:48
pour appeler une fonction d'un fichier C++ dans un fichier C, il faut declarer les prototypes des fonctions utilisées extern "C" void fonction(), non?
et idem pour une fonction d'un fichier C appelée d'un fichier C++.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
6 avril 2007 à 17:20
La VTable est une table contenant les pointeurs sur toutes les méthodes de l'interface.

Pour appeler la méthode Release() de ton exemple il faut faire:
stream->lpVtbl->Release(stream);

bbear > Une interface COM est considérée comme
une classe en C++. En C, c'est une structure. Cette structure fournit
un pointeur vers la VTable de l'interface. Normalement, les fichiers .h
contiennent les déclarations pour le C++ et celles pour le C.
0
Rejoignez-nous