1

我在 Delphi 6 中有一个应用程序,由于库问题,我需要用 C# 或 C++ 编写一个组件,该组件将存在于 Delphi 表单中。该程序目前是 Delphi 和 C#,它调用 C# 进行对话框。我需要一些嵌入到 TForm 中的东西,它可以让我在 C# 中绘制该组件。

我想我可以在 Delphi 中创建一个组件,在它的Paint例程中我只是调用 DLL 中的函数。但是我应该将什么传递给 C# DLL 以便它可以在该窗口中进行绘制,以及如何让 C# 真正做到这一点?

我想只要能够在 C# 中按需绘制一些任意 DC 就是我需要做的。

4

1 回答 1

0

C#

public static void DoIt(IntPtr srcWindow)
{
Graphics g = Graphics.FromHwnd(srcWindow);
g.DrawLine(new Pen(Color.Red), new Point(0, 0), new Point(400, 400));
}

德尔福:

type
    intPtrArgs = procedure(hand : hwnd); StdCall;

procedure T_CS.RePaint;  //extends TWinControl
var
  Hm: HModule;
  ExtDoIt: intptrArgs;  
begin
  Hm := LoadLibrary(pchar('my.dll'));
  try
    @ExtDoIt := GetProcAddress(Hm, 'DoIt');
    ExtDoIt(Handle);
  finally
    FreeLibrary(Hm);
  end;
end;

在每种油漆上加载卸载是很愚蠢的,但例如,它可以工作。

对于尝试执行此操作的其他人,您将需要搜索“反向 P/Invoke”,以便能够以另一种语言查看 C# DLL 过程。

反向 P/Invoke 示例 http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm

于 2012-10-04T18:34:32.207 回答