c# - .NET डीएलएल को क्लेरीयन कॉलबैक प्रक्रिया प्राप्त करने की जरूरत है और तब सभी तीन इन्ट्स पास करते हैं?



callback clarion (1)

उम्मीद है कि यह उदाहरण आपको कहीं शुरू करने के लिए देता है, यह सॉफ्टवेलोसिटी न्यूजग्रुप (यहां कैश्ड सादा पाठ संस्करण) से एक उदाहरण पर आधारित है।

नोट: मैं एक संगत लिब फ़ाइल बनाने के लिए RGiesecke DllExport पैकेज और Clarion LibMaker का एक संशोधित संस्करण का उपयोग कर रहा हूं। आपने उल्लेख किया है कि आप पहले से ही सी # डीएलएल को बिना किसी समस्या के कॉल कर रहे हैं इसलिए मैं मानता हूं कि आप कुछ इसी तरह कर रहे हैं। अगर आप रुचि रखते हैं, तो मैं इस ब्लॉग पर आगे बढ़ता हूं।

क्लेयरियन कोड

  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'

सी # कोड

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

  }
}

मैं Clarion (Clarion प्रोग्रामिंग भाषा की तरह सी ++) प्रोग्राम के लिए एक सी # .NET डीएलएल लिख रहा हूँ।

मैं C # .NET DLL में बस ठीक कहता हूँ, ये सब बहुत अच्छा काम कर रहा है। हालांकि, मुझे कॉलबैक प्रयोजनों के लिए क्लेयरियन प्रक्रिया प्राप्त करने के लिए C # .NET डीएलएल की आवश्यकता है और फिर उस तीन प्रो पैरामीटर को पारित करने के लिए उस प्रक्रिया को कॉल करने में सक्षम होना चाहिए।

Clarion प्रक्रिया इस तरह दिखता है (एक Clarion लंबे सी # int है):

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

मैं सी # .NET DLL के लिए abvoe प्रक्रिया कैसे पारित कर सकता हूँ और C # .NET DLL कॉल को कैसे चलाता है जो कि तीन int पैरामीटर पारित कर रहा है?

अग्रिम में धन्यवाद।





clarion