2017-09-07 7 views
4

J'ai une fonction Delphi dans une dll écrite comme ceci:Comment passer un bitmap à une DLL écrite par Delphi en C#?

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

Je veux l'utiliser en C#, j'ai essayé mais je n'a pas réussi:

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

Erreur: " Vous avez tenté de lire ou d'écrire de la mémoire protégée, ce qui indique souvent que d'autres mémoires sont corrompues. "

Comment est-ce que je peux faire ceci?

Répondre

3

La classe TBitmap de Delphi est très différente de la classe Bitmap de .NET. Ils ne sont pas compatibles entre eux et ne sont pas non plus sécurisés à des fins d'interopérabilité.

Vous devrez utiliser un handle Win32 HBITMAP brut à la place.

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

J'ai fait la même chose mais en C# cette erreur se produit: "Une erreur générique s'est produite dans GDI +.". En Delphi j'ai fait "var B: TBitmap; ... B.Handle: = Bitmap; B.SaveToFile (" D: \ A.BMP ");" cela fonctionne mais "B.Handle: = Bitmap;" provoque un problème! –

5

Vous ne pouvez pas utiliser cette fonction. Il n'est même pas sûr d'utiliser entre deux modules Delphi sauf si vous utilisez des paquets. Vous ne pouvez pas passer des classes Delphi natives à travers une limite de module comme celle-ci.

Vous devrez passer à un type compatible interopérabilité. L'option évidente est d'utiliser un HBITMAP. Vous devrez modifier la bibliothèque Delphi. Si vous n'avez pas la source, vous devrez contacter le développeur d'origine.

+0

J'ai le code source, mais comment puis-je le faire? J'ai besoin d'un exemple de travail. –

+1

Alors écrivez-en un. Les classes bitmap dans C# et delphi fournissent des moyens d'interopérer avec les poignées bitmap Win32. Lire de la documentation et ne pas être sans défense. Faites plus d'effort. –

+0

pas testet .... procédure ChangeBitmap (var BmpHandle: hBitmap; var Bmp: TBitmap); begin Bmp.Handle: = BmpHandle; BmpHandle: = Bmp.ReleaseHandle; fin; – user1769184