Interopérer avec win32 n'est pas toujours aisé. La notion de pointeur n'existant pas en .Net, quelques petits problèmes peuvent arriver...

Prenons le cas de la méthode GetDIBits de gdi32.dll.

http://msdn2.microsoft.com/en-us/library/ms532334.aspx

int GetDIBits( HDC hdc, // handle to DC HBITMAP hbmp, // handle to bitmap UINT uStartScan, // first scan line to set UINT cScanLines, // number of scan lines to copy LPVOID lpvBits, // array for bitmap bits LPBITMAPINFO lpbi, // bitmap data buffer UINT uUsage // RGB or palette index );

Nous pouvons la mapper en .Net grâce à un

http://pinvoke.net/default.aspx/gdi32/GetDIBits.html

[DllImport("gdi32.dll")] static extern int GetDIBits(IntPtr hdc, IntPtr hbmp, uint uStartScan, uint cScanLines, out byte[] lpvBits, ref BITMAPINFO lpbmi, uint uUsage);

"If lpvBits is NULL, GetDIBits examines the first member of the first structure pointed to by lpbi. This member must specify the size, in bytes, of a BITMAPCOREHEADER or a BITMAPINFOHEADER structure. The function uses the specified size to determine how the remaining members should be initialized."

Cette technique est souvent utilisée par les APIs de windows: avant d'appeler une méthode qui remplit un buffer, on l'appelle une première fois avec la valeur nulle (et non pas un pointeur sur null !) et on récupère la taille du buffer à allouer en retour. Ensuite on alloue le buffer et on réappelle la même méthode en passant cette fois-ci le buffer.

Si vous ne comprenez pas le contexte, ce n'est pas très grave. Voici ma question: comment passer la valeur nulle (0) dans la référence out byte[] lpvBits ?

[Update] Quizz suivant : Geek Quizz XI: reflection ?