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

问题描述:

我有这样写的DLL中的德尔福功能:如何将位图传递给Delphi在C#中编写的dll?

 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! 
    } 

错误:“试图读取或写入受保护的内存,这通常表示其他内存已损坏。“

我该怎么做?

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); 
    } 
} 
+0

我做了同样的事情,但在C#中发生此错误:“在GDI +中发生了一般性错误”。在Delphi中,我做了“var B:TBitmap; ... B.Handle:= Bitmap; B.SaveToFile(”D:\ A.BMP“);”它的工作原理是“B.Handle:= Bitmap;”导致一个问题! –

您不能使用此功能。除非使用包,否则在两个Delphi模块之间使用并不安全。你不能像这样在模块边界上传递原生的Delphi类。

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

+0

我的源代码,但我该怎么办呢?我需要一个工作示例。 –

+1

所以写一个。 C#和delphi中的位图类提供了与Win32位图句柄交互的手段。阅读一些文档,不要无奈。做更多的努力。 –

+0

not testet .... 程序ChangeBitmap(var BmpHandle:hBitmap; var Bmp:TBitmap); begin Bmp.Handle:= BmpHandle; BmpHandle:= Bmp.ReleaseHandle; 结束; – user1769184