3

Clarion (Clarion はプログラミング言語のような C++ です) プログラム用の C# .NET DLL を作成しています。

C# .NET DLL を正常に呼び出しました。すべて正常に動作しています。ただし、コールバックの目的で Clarion プロシージャを受け取り、3 つの int パラメータを渡してそのプロシージャを呼び出すことができるようにするには、C# .NET DLL が必要です。

Clarion プロシージャは次のようになります (Clarion long は C# int です)。

MyCallBack procedure(long p1, long p2, long p3)
... Data ...
    code
    ... Code ...

abvoe プロシージャを C# .NET DLL に渡す方法と、C# .NET DLL がそのプロシージャを呼び出して 3 つの int パラメータを渡す方法を教えてください。

前もって感謝します。

4

1 に答える 1

3

この例は、SoftVelocity ニュースグループ (キャッシュされたプレーン テキスト バージョンはこちら) の例に基づいています。

注: RGiesecke DllExportパッケージと Clarion LibMaker の修正バージョンを使用して、互換性のある lib ファイルを作成しています。あなたはすでに C# DLL を問題なく呼び出しているとおっしゃっていたので、似たようなことをしていると思います。興味があれば、ブログで詳しく説明します。

クラリオンコード

  PROGRAM
  MAP
    MODULE('ManagedCSharpDLL.dll')
CallbackProc                PROCEDURE(BSTRING PassedValue, *BSTRING ReturnValue),TYPE,PASCAL,DLL(TRUE)
SetCallback                 PROCEDURE(*CallbackProc pCallback),NAME('SetCallback'),PASCAL,RAW,DLL(TRUE)
TestCallback                PROCEDURE(*CString passedString),NAME('TestCallback'),PASCAL,RAW,DLL(TRUE)
    END
Callback                PROCEDURE(BSTRING PassedValue, *BSTRING ReturnValue),PASCAL
  END
a                   CSTRING(20)

CODE
  Message('Clarion: SetCallback(Callback)')
  SetCallback(Callback)

  a = 'Call Test Worked'
  Message('Clarion: Send message: ' & a)

  TestCallback(a)

  Message('Clarion: Made call and got back safely')

Callback      PROCEDURE(BSTRING PassedValue, *BSTRING ReturnValue)

  CODE
    MESSAGE('Clarion: Passed Value: ' & PassedValue)
    ReturnValue = 'Done'

C# コード

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using RGiesecke.DllExport;

namespace ManagedCSharpDLL
{
  public static class UnmanagedExports
  {

    private static CallbackProc _callback;

    [DllExport("SetCallback", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    public static void SetCallback(CallbackProc pCallback)
    {
      _callback = pCallback;
      MessageBox.Show("C#: SetCallback Completed");
    }

    [DllExport("TestCallback", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    public static void TestCallback(string passedString)
    {
      string displayValue = passedString;
      string returnValue = String.Empty;

      MessageBox.Show("C#: About to call the Callback. displayValue=" + displayValue + ", returnValue=" + returnValue);
      _callback(displayValue, ref returnValue);
      MessageBox.Show("C#: Back from the Callback. displayValue=" + displayValue + ", returnValue=" + returnValue);
    }

    public delegate void CallbackProc( [MarshalAs(UnmanagedType.BStr)] String PassedValue,  [MarshalAs(UnmanagedType.BStr)] ref String ReturnValue);

  }
}
于 2013-07-18T09:57:41.630 に答える