c# .net callback clarion

c# - .NET DLL necesita recibir un procedimiento de devolución de llamada Clarion y luego todo lo que pasa tres ints?



callback (1)

Esperemos que este ejemplo le brinde un lugar donde comenzar, se basa en un ejemplo de los grupos de noticias de SoftVelocity (versión de texto plano en caché aquí ).

Nota: Estoy usando el paquete RGiesecke DllExport y una versión modificada de Clarion LibMaker para crear un archivo lib compatible. Usted mencionó que ya está llamando al DLL de C # sin problema, así que supongo que está haciendo algo similar. Si estás interesado, profundizaré en esto en mi blog .

Código Clarion

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 # Code

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

Estoy escribiendo una DLL C # .NET para un programa Clarion (Clarion es C ++ como el lenguaje de programación).

Llamé a la DLL de C # .NET bien, todo funciona bien. Sin embargo, necesito esa DLL C # .NET para recibir un Procedimiento de Clarion para propósitos de devolución de llamada y luego poder llamar a ese procedimiento pasando tres parámetros int.

El procedimiento Clarion se ve así (un Clarion long es un C # int):

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

¿Cómo paso el procedimiento abvoe al DLL de C # .NET y cómo llama el DLL de C # a ese procedimiento que pasa tres parámetros int?

Gracias por adelantado.