一个关于C#使用P/Invoke调用的问题

pghzwh301 2008-05-14 06:11:54
一个关于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);
...全文
128 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2008-05-15
  • 打赏
  • 举报
回复
互操作问题,你可以去C+或者C++版问

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧