请教大家如何在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可以用。请求大家的帮助,谢谢
extern __declspec(dllimport) BOOL WINAPI GetOutputBMPdata(UCHAR const ** pData, BITMAPINFO const ** pInfo);如果用c#调用DllImport应该怎么写?主要是类型要正确,UCHAR对应byte但是不知道UCHAR const **这个二维的图像数据矩阵要怎么转换,还有是不是要在C#里把BITMAPINFO也重构出来啊,这个应该不是很必要,毕竟C#有Bitmap和BitmapData可以用。请求大家的帮助,谢谢
如下:
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);
难道是用ref byte[] ?
/// 封送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;
}
[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 今晚真成了我的世界末日了。
结贴