Этот код отлично работает при запуске 32-разрядной версии. Но когда я переключаюсь на 64-битную версию, метод GetObject
не работает, а структура BITMAP
пуста.
IntPtr hBmp = ObtainValidBitmapHandleFromSystem();
BITMAP bmpData = new BITMAP();
/* BITMAP consists of four 32bit ints,
* two 16 bit uints and one IntPtr */
* 4 + sizeof(UInt16) * 2 + IntPtr.Size;
int cbBuffer = sizeof(Int32) * 4 + sizeof(UInt16) * 2 + IntPtr.Size;
NativeMethods.GetObject(hBmp, cbBuffer, out bmpData);
Bitmap bmp = new Bitmap(bmpData.Width, bmpData.Height, PixelFormat.Format32bppPArgb);
Реализация нативного метода:
private static class NativeMethods
{
[DllImport("gdi32", CharSet = CharSet.Auto)]
internal extern static int GetObject(
IntPtr hgdiobj, // handle to graphics object
int cbBuffer, // size of buffer for object information
out BITMAP lpvObject // Should be IntPtr, but we know we will use it only for BITMAP.
);
}
Реализация структуры BITMAP (документация удалена для сохранения компактности кода):
[StructLayoutAttribute(LayoutKind.Sequential)]
private struct BITMAP
{
public Int32 Type;
public Int32 Width;
public Int32 Height;
public Int32 WidthBytes;
public UInt16 Planes;
public UInt16 BitsPixel;
public IntPtr Bits;
}
Идея этого кода полностью описана в этом вопрос.
Сначала я подумал, что проблема вызвана разным размером IntPtr
, что приводит к разному размеру cbBuffer
, но кажется, что это не так, поскольку изменение размера cbBuffer
не помогло.
Как правильно использовать метод GetObject
GDI в 64-битной системе?
NativeMethods
. - person SiliconMind   schedule 11.04.2013GetObject
структураBITMAP
по-прежнему пуста (все ее значения равны нулю). - person SiliconMind   schedule 11.04.2013