一个关于C#使用P/Invoke调用的问题目标函数是用C写的取设备无关位图的DLL,用MFC程序调用测试,运行正常。
用C#调用时,发现无论如何也得不到想要的结果。参数类型使用IntPtr应该没问题吧?好多贴子都是这样调用的。
调用方式无论用out或ref或不带任何方式都不行。以下是代码,请帮忙分析一下,谢谢。-------------------------------------------------------------------------
TestDll.cTESTDLL_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);
用C#调用时,发现无论如何也得不到想要的结果。参数类型使用IntPtr应该没问题吧?好多贴子都是这样调用的。
调用方式无论用out或ref或不带任何方式都不行。以下是代码,请帮忙分析一下,谢谢。-------------------------------------------------------------------------
TestDll.cTESTDLL_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);
解决方案 »
- 获得数据库中倒数第二条数据时报错
- c#多线程的问题
- 大侠们,如何实现窗体的拆分和合并呢?如skype聊天窗体样。
- |zyciis| 如何用C#来对控件webBrowser实现自动输入和提交,谢谢 急
- 请问TreeView控件的结点可以使用透明的图标吗?
- 在winform中怎么在DataGrid给指定行加颜色
- 怎样对DataSet中的数据进行导航?
- .Net4.0 Workflow ToolboxItemWrapper构造函数的bitmapName参数问题
- 一个C#入门的问题(初学者问)
- 关于Winform中Tabcontrol的高级问题(新人没分,大家别嫌弃我,将来一定补)
- 為何我的數據集中某一表中同一字段出現兩次,第二個後面跟了數字1
- 有没有哪位高手做过可以在console模式下发送邮件的C#实例
====>
BYTE** DIBTemp你那样得不到返回值的
因为在程序内部修改指针变量的地址,返回后无效,而其你的c++代码由memory leakIntPtr
====>
ref byte[]
既然内存是调用程序创建的,上面这句话压根不需要。
调用声明修改为:
public static extern void GetBmp(Byte[] p);
调用代码如下:
Byte[] b = new byte[800*600*4];
GetBmp(b);试试看行不行。
http://blog.csdn.net/Mittermeyer/archive/2007/04/27/1586867.aspx