请教C#调用C++ dll时一个难导入的函数

azkabanNULL 2012-12-21 11:24:54
请教大家如何在C#中导入如下的函数,这个函数在c++写的dll中:
extern __declspec(dllimport) BOOL WINAPI GetOutputBMPdata(UCHAR const ** pData, BITMAPINFO const ** pInfo);

如果用c#调用DllImport应该怎么写?主要是类型要正确,UCHAR对应byte但是不知道UCHAR const **这个二维的图像数据矩阵要怎么转换,还有是不是要在C#里把BITMAPINFO也重构出来啊,这个应该不是很必要,毕竟C#有Bitmap和BitmapData可以用。

请求大家的帮助,谢谢
...全文
150 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
azkabanNULL 2012-12-22
  • 打赏
  • 举报
回复

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct BITMAPINFO
{
    /// BITMAPINFOHEADER->tagBITMAPINFOHEADER
    public BITMAPINFOHEADER bmiHeader;

    /// RGBQUAD[1]
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 1, ArraySubType = UnmanagedType.Struct)]
    public RGBQUAD[] bmiColors;
}

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
    /// DWORD->unsigned int
    public uint biSize;

    /// LONG->int
    public int biWidth;

    /// LONG->int
    public int biHeight;

    /// WORD->unsigned short
    public ushort biPlanes;

    /// WORD->unsigned short
    public ushort biBitCount;

    /// DWORD->unsigned int
    public uint biCompression;

    /// DWORD->unsigned int
    public uint biSizeImage;

    /// LONG->int
    public int biXPelsPerMeter;

    /// LONG->int
    public int biYPelsPerMeter;

    /// DWORD->unsigned int
    public uint biClrUsed;

    /// DWORD->unsigned int
    public uint biClrImportant;
}

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct RGBQUAD
{
    /// BYTE->unsigned char
    public byte rgbBlue;

    /// BYTE->unsigned char
    public byte rgbGreen;

    /// BYTE->unsigned char
    public byte rgbRed;

    /// BYTE->unsigned char
    public byte rgbReserved;
}

public partial class NativeMethods
{

    /// Return Type: BOOL->int
    ///pData: UCHAR**
    ///pInfo: BITMAPINFO**
    [DllImportAttribute("<Unknown>", EntryPoint = "MAG_GetOutputColorBardata")]
    [return: MarshalAsAttribute(UnmanagedType.Bool)]
    public static extern bool MAG_GetOutputColorBardata(ref IntPtr pData, ref IntPtr pInfo);

}
不是找到P/Invoke Interop Assistant 今晚真成了我的世界末日了。。。。 结贴
azkabanNULL 2012-12-21
  • 打赏
  • 举报
回复
http://blog.csdn.net/lifeilin6671/article/details/8287271 难道是用ref byte[] ?
azkabanNULL 2012-12-21
  • 打赏
  • 举报
回复
这个函数功能是获取输出的256色位图数据,用于在View中绘图的 如下:
const UCHAR * pBmpData=NULL, * pColorBarData=NULL;
const BITMAPINFO * pBmpInfo=NULL, * pColoarBarInfo=NULL;
	
if ( !MAG_GetOutputBMPdata(&pBmpData, &pBmpInfo) ||
	!MAG_GetOutputColorBardata(&pColorBarData, &pColoarBarInfo))
{
	MAG_UnLockFrame();
	MemDC.SelectObject(pOldBit);
	MemBitmap.DeleteObject();
	MemDC.DeleteDC();
	return;
}

StretchDIBits(MemDC.GetSafeHdc(), 5, 5, BMPWIDTH, BMPHEIGHT, 
	0, 0, BMPWIDTH, BMPHEIGHT, 
	pBmpData, pBmpInfo,
	DIB_RGB_COLORS, SRCCOPY);
言多必失 2012-12-21
  • 打赏
  • 举报
回复
不清楚C++
azkabanNULL 2012-12-21
  • 打赏
  • 举报
回复
/// <summary>
/// 封送C++中的BITMAPINFOHEADER结构。
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct BitmapInfoHeader
{
    [MarshalAs(UnmanagedType.I4)]
    public Int32 biSize;
    [MarshalAs(UnmanagedType.I4)]
    public Int32 biWidth;
    [MarshalAs(UnmanagedType.I4)]
    public Int32 biHeight;
    [MarshalAs(UnmanagedType.I2)]
    public short biPlanes;
    [MarshalAs(UnmanagedType.I2)]
    public short biBitCount;
    [MarshalAs(UnmanagedType.I4)]
    public Int32 biCompression;
    [MarshalAs(UnmanagedType.I4)]
    public Int32 biSizeImage;
    [MarshalAs(UnmanagedType.I4)]
    public Int32 biXPelsPerMeter;
    [MarshalAs(UnmanagedType.I4)]
    public Int32 biYPelsPerMeter;
    [MarshalAs(UnmanagedType.I4)]
    public Int32 biClrUsed;
    [MarshalAs(UnmanagedType.I4)]
    public Int32 biClrImportant;
}

/// <summary>
/// 封送C++中的BITMAPINFO结构。
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct BitmapInfo
{
    [MarshalAs(UnmanagedType.Struct, SizeConst = 40)]
    public BitmapInfoHeader bmiHeader;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
    public Int32[] bmiColors;
}

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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