1

Delphi 6でアプリケーションを使用していますが、ライブラリの問題により、Delphiフォームに存在するC#またはC++でコンポーネントを作成する必要があります。プログラムは現在DelphiとC#であり、ダイアログ用にC#を呼び出します。C#でそのコンポーネントを描画できるようにするTFormに埋め込まれたものが必要です。

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;

各ペイントにアンロードをロードするのはばかげていますが、たとえば目的のために機能します。

これを行おうとしている他の人は、「Reverse P / Invoke」をグーグルで検索して、C#DLLプロシージャを別の言語で表示できるようにする必要があります。

リバースP/Invokeの例 http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm

于 2012-10-04T18:34:32.207 に答える