一个关于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);

解决方案 »

  1.   

    tryBYTE *DIBTemp
    ====>
    BYTE** DIBTemp你那样得不到返回值的
    因为在程序内部修改指针变量的地址,返回后无效,而其你的c++代码由memory leakIntPtr
    ====>
    ref byte[]
      

  2.   

    DIBTemp = new BYTE[800 * 600 * 4]; 
    既然内存是调用程序创建的,上面这句话压根不需要。
    调用声明修改为:
    public static extern void GetBmp(Byte[] p);
    调用代码如下:
    Byte[] b = new byte[800*600*4];
    GetBmp(b);试试看行不行。
      

  3.   

    可以参考一下:
    http://blog.csdn.net/Mittermeyer/archive/2007/04/27/1586867.aspx