如何将位图传递给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);
}
}
您不能使用此功能。除非使用包,否则在两个Delphi模块之间使用并不安全。你不能像这样在模块边界上传递原生的Delphi类。
您需要切换到交互式友好型。显而易见的选择是使用HBITMAP
。您将需要修改Delphi库。如果您没有源代码,您需要联系原始开发人员。
我的源代码,但我该怎么办呢?我需要一个工作示例。 –
所以写一个。 C#和delphi中的位图类提供了与Win32位图句柄交互的手段。阅读一些文档,不要无奈。做更多的努力。 –
not testet .... 程序ChangeBitmap(var BmpHandle:hBitmap; var Bmp:TBitmap); begin Bmp.Handle:= BmpHandle; BmpHandle:= Bmp.ReleaseHandle; 结束; – user1769184
我做了同样的事情,但在C#中发生此错误:“在GDI +中发生了一般性错误”。在Delphi中,我做了“var B:TBitmap; ... B.Handle:= Bitmap; B.SaveToFile(”D:\ A.BMP“);”它的工作原理是“B.Handle:= Bitmap;”导致一个问题! –