2017-09-07 110 views
4

我有這樣寫的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! 
    } 

錯誤:「試圖讀取或寫入受保護的內存,這通常表示其他內存已損壞。「

我該怎麼做?

回答

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

我做了同樣的事情,但在C#中發生此錯誤:「在GDI +中發生了一般性錯誤」。在Delphi中,我做了「var B:TBitmap; ... B.Handle:= Bitmap; B.SaveToFile(」D:\ A.BMP「);」它的工作原理是「B.Handle:= Bitmap;」導致一個問題! –

5

您不能使用此功能。除非使用包,否則在兩個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

相關問題