我在Delphi 6中有一个应用程序,由于库问题,我需要用C#或C++编写一个将存在于Delphi表单上的组件。该程序目前是Delphi和C#,它为对话框调用C#。我需要嵌入到 TForm 中的东西,以便我用 C# 绘制该组件。
我想我可以在 Delphi 中创建一个组件,在其Paint
例程中,我只需在 DLL 中调用该函数。但是,我应该传递给 C# DLL 什么,以便它可以在该窗口中绘制,以及如何让 C# 实际执行此操作?
我想我只需要能够在 C# 中按需绘制一些任意 DC 即可。
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/调用示例http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm