Différence entre GlobalAlloc et new

Le
Stéphane Vasseur
j'ai un petit soucis je compilais un programme sous Xp qui marchais
parfaitement hors sous Seven paf le crash.

le problème viens de l'allocation mémoire je pense.

char *bufferjpeg = new char[Taillemax];

après je charge mon fichier jpeg dans bufferjpeg.
et j’appelle une routine pour afficher le jpeg dont le début fait :

long pictureWidth, pictureHeight;
char *dataptr;
HGLOBAL hGlobal;
LPSTREAM pictureStreamPtr;
LPPICTURE picture;

HBITMAP memBitmap, oldBitmap;
HDC memDC;
void *pixelptr;
BITMAPINFO bmi;
CreateStreamOnHGlobal((void*)bufferjpeg, TRUE, &picturestreamptr);
OleLoadPicture(picturestreamptr, 0, FALSE, IID_IPicture , (LPVOID
*)&picture);
picture->get_Width(&picturewidth);
a partir de la ça crash sous Seven mais pas sous XP !

en gros il as pas aimé je suppose ma conversion de ma mémoire allouer
par new en
(void*) qui est normalement un pointeur Hglobal.


si je fait à la place :

char *bufferjpeg = new char[Taillemax];

Je charge mon fichier jpeg dans bufferjpeg.
puis j’appelle une routine pour afficher le jpeg dont le début fait :

hGlobal = GlobalAlloc(GMEM_MOVEABLE, Taillemax);
dataptr = (char*) GlobalLock(hGlobal);
for (t = 0 ; t < 1280 * 1024 * 3 ; t++)
*dataptr++ = bufferjpeg[t];
CreateStreamOnHGlobal(hGlobal, TRUE, &pictureStreamPtr);
OleLoadPicture(pictureStreamPtr, 0, FALSE, IID_IPicture , (LPVOID
*)&picture);
picture->get_Width(&pictureWidth);

ça marche sous Seven et XP. seulement ça m'oblige a faire une copie
des données déjà chargées alors que avec ma méthode
je lui passais directement le pointeur de mes données.

ma question une idée de pourquoi ça marche plus sous SEVEN ?
J'ai chercher un peu sur google et j'ai vu que c’était même pas bien
d'utiliser GlobalAlloc c'est vrai ?
en gros il y a un autre moyen pour créer un stream directement sur ma
mémoire allouer par new ?

je maitrise assez mal les objet OLE il y a surement quelque chose de
simple que je n'es pas compris.
mais je trouvais sa pratique pour afficher du jpeg en quelques ligne.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #23247811
Stéphane Vasseur a écrit :

ma question une idée de pourquoi ça marche plus sous SEVEN ?
J'ai chercher un peu sur google et j'ai vu que c’était même pas bien
d'utiliser GlobalAlloc c'est vrai ?
en gros il y a un autre moyen pour créer un stream directement sur ma
mémoire allouer par new ?



Pour charger un fichier dans stream avec HGLOBAL, on fait en principe
comme ça =>
(pas testé sous Seven...)
(sinon il y a de nombreux autres moyens pour charger des JPG simplement)

LPPICTURE gpPicture;
HGLOBAL hGlobal;
LPVOID pvData = NULL;
DWORD dwFileSize;
HANDLE hFile = CreateFile("foo.jpg", GENERIC_READ, 0, NULL,
OPEN_EXISTING, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
dwFileSize = GetFileSize(hFile, NULL);
if (dwFileSize != -1)
{
hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
if (hGlobal != NULL)
{
pvData = GlobalLock(hGlobal);
if (pvData != NULL)
{
DWORD dwBytesRead = 0;
BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
if (bRead)
{
GlobalUnlock(hGlobal);
CloseHandle(hFile);
}
}
}
}
}

LPSTREAM pstm = NULL;
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
if (SUCCEEDED(hr) && pstm)
{

hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID
*)&gpPicture);
if (SUCCEEDED(hr) && gpPicture)
{
pstm->Release();
// ... etc
Stéphane Vasseur
Le #23249361
merci Christian de m'avoir répondu mais en fait j'ai dut mal
m'exprimer,

Je sais que si j'utilise GlobalAlloc ca marche.
Cependant je veut passer par un new ou tout autre forme de buffer que
j'aurais déjà crée en mémoire sans justement appeler GlobalAlloc.

et donc moi au lieu de la ligne :
CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);

je faisait :
CreateStreamOnHGlobal((void*)bufferjpeg, TRUE, &pstm);

bufferjpeg étant le buffer qui contiens mon image jpeg.
qui est créer sans passer par GlobalAlloc :

char *bufferjpeg = new char[taille]; tout simplement

donc ce code la marchais très bien Sous XP et ca plante sous Seven

La question est donc y a t'il un autre moyen pour créer un stream
directement sur mon buffer, une autre fonction ?

(sinon il y a de nombreux autres moyens pour charger des JPG
simplement)

je suis preneur mais je veut pas passer par une librairie externe
etc...
Christian ASTOR
Le #23250301
Stéphane Vasseur a écrit :
merci Christian de m'avoir répondu mais en fait j'ai dut mal
m'exprimer,

Je sais que si j'utilise GlobalAlloc ca marche.
Cependant je veut passer par un new ou tout autre forme de buffer que
j'aurais déjà crée en mémoire sans justement appeler GlobalAlloc.



Mais, ce n'est pas bon.
Il faut un HGLOBAL, c'est construit comme ça.
GlobalAlloc() appelle RtlAllocateHeap() sur RtlProcessHeap()
new() appelle HeapAlloc() qui appelle RtlAllocateHeap() sur _crtheap


(sinon il y a de nombreux autres moyens pour charger des JPG
simplement)
je suis preneur mais je veut pas passer par une librairie externe
etc...



Oui, on n'a jamais besoin de lib externes sous Windows, tout est inclus
dans l'api (interfaces comme IThumbnail pour les JPG)
torri
Le #23251881
On Fri, 01 Apr 2011 12:33:40 +0200, Christian ASTOR wrote:

Oui, on n'a jamais besoin de lib externes sous Windows, tout est inclus
dans l'api (interfaces comme IThumbnail pour les JPG)



je ne veux pas troller, mais je doute quant à cette assertion. Windows
peux lire en natif les fichier jpeg2000, dvi, djvu, comic book, ... ?
Publicité
Poster une réponse
Anonyme