0 votes

Problème de copymemory() dans Windows

struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO;

tagBITMAPINFOHEADER{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;

} BITMAPINFOHEADER

BITMAPINFO bmiCurrWindow;

capGetVideoFormat((*m_pCapWndArray)[i].hCapWnd, &bmiCurrWindow, formatsize);

CopyMemory(&(*m_pCapWndArray)[i].bmiHeader, &(bmiCurrWindow.bmiHeader), sizeof(BITMAPINFOHEADER));

bmiCurrWindow est une structure 'BITMAPINFO' dont le membre 'bmiHeader' est de type BITMAPINFOHEADER ;

Après avoir copié la mémoire, je veux changer la valeur de bmiCurrWindow. Par exemple, je veux que bmiCurrWindow.bmiHeader.biWidth=480 ; bmiCurrWindow.bmiHeader.biHeight=640 ;

Mais si j'écris le code ci-dessus, lors de l'exécution, il me donne une erreur d'accès.

Comment puis-je le restaurer ?

1voto

Remy Lebeau Points 130112

La façon correcte (et documentée) d'utiliser capGetVideoFormat() est de l'appeler deux fois - une fois pour obtenir la taille de la mémoire requise, puis allouer la mémoire de cette taille, et enfin l'appeler une seconde fois pour remplir la mémoire. Cela est dû au fait que le membre BITMAPINFO::bmiColors est de longueur variable, et que vous devez donc vous assurer que vous avez suffisamment de mémoire pour recevoir toutes ces données. Dans l'état actuel de votre code, vous allouez un BITMAPINFO sur la pile, mais la déclaration du BITMAPINFO ne prévoit de la place que pour un seul élément RGBQUAD dans son membre bmiColors. Si votre format vidéo contient plus d'une couleur, vous corrompez la mémoire de la pile. Vous devez plutôt allouer dynamiquement le BITMAPINFO sur le tas, par exemple :

DWORD dwSize = capGetVideoFormat((*m_pCapWndArray)[i].hCapWnd, NULL, 0); 
if (dwSize > 0)
{
  BITMAPINFO *bmpInfo = (BITMAPINFO*) malloc(dwSize);
  if (bmpInfo != NULL)
  {
    capGetVideoFormat((*m_pCapWndArray)[i].hCapWnd, bmpInfo, dwSize);
    (*m_pCapWndArray)[i].bmiHeader = bmpInfo->bmiHeader;
  }
  free(bmpInfo);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X