一个关于C#使用P/Invoke调用的问题
一个关于C#使用P/Invoke调用的问题
目标函数是用C写的取设备无关位图的DLL,用MFC程序调用测试,运行正常。
用C#调用时,发现无论如何也得不到想要的结果。
参数类型使用IntPtr应该没问题吧?好多贴子都是这样调用的。
调用方式无论用out或ref或不带任何方式都不行。
以下是代码,请帮忙分析一下,谢谢。
-------------------------------------------------------------------------
TestDll.c
TESTDLL_API void GetBmp(BYTE *DIBTemp)
{
DIBTemp = new BYTE[800 * 600 * 4];
CBitmap bitmap;
bitmap.LoadBitmap(@ "C:\SelfCode\BitmapTest\Winter.bmp ");
CDC dcSketch;
dcSketch.CreateCompatibleDC(NULL);
dcSketch.SelectObject(bitmap);
ZeroMemory( DIBTemp, 800 * 600 * 4 );
BITMAPINFO bminfo;
bminfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER ); // Size Of The BitmapInfoHeader
bminfo.bmiHeader.biPlanes = 1; // Bitplanes
bminfo.bmiHeader.biBitCount = 32; // Bits Format We Want (32 Bit, 4 Bytes)
bminfo.bmiHeader.biWidth = 800; // Width We Want (800 Pixels)
bminfo.bmiHeader.biHeight = 600; // Height We Want (600 Pixels)
bminfo.bmiHeader.biCompression = BI_RGB; // Requested Mode = RGB
GetDIBits(
dcSketch, // handle to DC
bitmap , // handle to bitmap
0, // first scan line to set
600, // number of scan lines to copy
DIBTemp, // array for bitmap bits
&bminfo, // bitmap data buffer
DIB_RGB_COLORS // RGB or palette index
);
}
--------------------------------------------------------------
TestBitmap.cs
[DllImport( "TestDll.dll ", EntryPoint = "#3 ")]
public static extern void GetBmp(out IntPtr p);
Byte[] b = new byte[800*600*4];
IntPtr p = Marshal.AllocCoTaskMem(b.Length);
Marshal.Copy(p, b, 0, b.Length);
GetBmp(out p);
Marshal.Copy(p, b, 0, b.Length);