我在这样写的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!
}
错误:"尝试读取或写入受保护的内存。这通常表明其他内存已损坏。"
我该怎么做?
答案 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);
}
}