【问题标题】:How to pass a bitmap to a dll written by Delphi in C#?如何将位图传递给 Delphi 在 C# 中编写的 dll?
【发布时间】:2017-09-07 16:35:27
【问题描述】:

我在一个这样写的 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!
    }

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

我该怎么做?

【问题讨论】:

    标签: c# image delphi dll bitmap


    【解决方案1】:

    您不能使用此功能。除非您使用包,否则在两个 Delphi 模块之间使用甚至是不安全的。您不能像这样跨模块边界传递本机 Delphi 类。

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

    【讨论】:

    • 我有源代码但是我该怎么做呢?我需要一个工作示例。
    • 所以写一个。 c# 和 delphi 中的位图类都提供了与 Win32 位图句柄进行互操作的方法。阅读一些文档,不要束手无策。加倍努力。
    • not testet .... 过程 ChangeBitmap(var BmpHandle: hBitmap ; var Bmp: TBitmap );开始 Bmp.Handle := BmpHandle; BmpHandle := Bmp.ReleaseHandle;结束;
    • 我做了同样的事情,但在 C# 中发生了这个错误:“GDI+ 中发生了一般错误。”。在德尔福我做了“var B: TBitmap; ... B.Handle := Bitmap; B.SaveToFile("D:\A.BMP");"它有效,但“B.Handle := Bitmap;”导致问题!。
    【解决方案2】:

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

    【讨论】:

    • 我做了同样的事情,但在 C# 中发生了这个错误:“GDI+ 中发生了一般错误。”。在德尔福我做了“var B: TBitmap; ... B.Handle := Bitmap; B.SaveToFile("D:\A.BMP");"它有效,但“B.Handle := Bitmap;”导致问题!。
    猜你喜欢
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多