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 problme viens de l'allocation mmoire je pense.

char *bufferjpeg = new char[Taillemax];

aprs je charge mon fichier jpeg dans bufferjpeg.
et jappelle une routine pour afficher le jpeg dont le dbut 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 mmoire 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 jappelle une routine pour afficher le jpeg dont le dbut 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 donnes dj charges alors que avec ma mthode
je lui passais directement le pointeur de mes donnes.

ma question une ide de pourquoi a marche plus sous SEVEN ?
J'ai chercher un peu sur google et j'ai vu que ctait mme pas bien
d'utiliser GlobalAlloc c'est vrai ?
en gros il y a un autre moyen pour crer un stream directement sur ma
mmoire 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.
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