如何将位图传递给Delphi在C#中编写的dll?

时间:2017-09-07 16:35:27

标签: c# image delphi dll bitmap

我在这样写的dll中有一个Delphi函数:

       function LensFlare(Bitmap: TBitmap; X, Y: Int32; Brightness: Real): TBitmap; StdCall;
       Begin
         // ...
         Result := Bitmap;
       End;

我想在C#中使用它, 我试过这个但是我没有成功:

    [DllImport("ImageProcessor")]
    static extern Bitmap LensFlare(Bitmap bitmap, int x, int y, double Brightness);

    private void button1_Click(object sender, EventArgs e)
    {
        Bitmap b = new Bitmap(@"d:\a.bmp");
        pictureBox1.Image = LensFlare(b, 100, 100, 50); // Error!
    }

错误:"尝试读取或写入受保护的内存。这通常表明其他内存已损坏。"

我该怎么做?

2 个答案:

答案 0 :(得分:5)

您无法使用此功能。除非你使用软件包,否则在两个Delphi模块之间使用它甚至都不安全。你不能像这样在模块边界传递本机Delphi类。

您需要切换到互操作友好型。显而易见的选择是使用HBITMAP。您需要修改Delphi库。如果您没有源,则需要联系原始开发人员。

答案 1 :(得分:3)

Delphi的TBitmap类与.NET的Bitmap类非常不同。它们彼此不兼容,并且对于互操作性而言都不安全。

您必须使用原始的Win32 HBITMAP句柄。

function LensFlare(Bitmap: HBITMAP; X, Y: Int32; Brightness: Real): HBITMAP; StdCall;
Begin
  // ...
  Result := Bitmap;
End;

[DllImport("ImageProcessor")]
static extern IntPtr LensFlare(PtrInt bitmap, int x, int y, double Brightness);

[DllImport("gdi32.dll")]
static extern bool DeleteObject(IntPtr hObject);

private void button1_Click(object sender, EventArgs e)
{
    Bitmap b = new Bitmap(@"d:\a.bmp");
    IntPtr hbmp = LensFlare(b.GetHbitmap(), 100, 100, 50);
    try {
        pictureBox1.Image = Image.FromHbitmap(hbmp);
    }
    finally {
        DeleteObject(hbmp);
    }
}