DllExport i callback z C/Delphi

0

Moge prosić o podpowiedz ?

Projekt w C# "ClassLibrary" eksportuje funkcje z pomocą "DllExport" , drobne schody są tylko z przekazywaniem do C# "callback"-ów
Jak po stronie C# uruchomić funkcję z Delphi/C ?
Po stronie C# nie uzywamy DLLImport tylko DLLExport , czyli strona niezarządzana wywołuje funkcje która ustawia callback

        private delegate int Callback(string text);
        private static Callback mInstance;   // Ensure it doesn't get garbage collected
        [DllExport]
        static void Set_Callback(Callback OnCallArrived)
        {
           mInstance = OnCallArrived;
           int iii = mInstance("aaaaaaaaaa"); // testuje 
            Console.WriteLine("iiii=" + iii.ToString());
        } 


type
  TProc2 = function (callData: Widestring): integer; cdecl;
   // of object ;
procedure Set_Callback(p_proc: TProc2); cdecl ; external 'TestLibrary.dll';
function test2(p_str: WideString): Integer; cdecl;
begin
  Writeln('ddddddddd');
  Writeln(p_str);
  Result := 9999;
end;

procedure TForm40.Button7Click(Sender: TObject);
begin
  Set_Callback(test2);  **//ustawiam CALLBACK**
end;


0

znalazlem przyklad z uzyciem "Marshal.GetDelegateForFunctionPointer"

https://stackoverflow.com/questions/38917043/how-to-send-a-function-pointer-using-unmanaged-exports-from-c-to-c-sharp-dll-t

i ogolnie to dziala prawie OK, adres funkcie jest przekazywandy do C#,
C# wywoluje funkcje i funkcja sie uruchamia
tylko ze po zakonczeniu funkcji mam AV :(
A jak debuguje w VS to mam

Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'C:\Users\aaa\Project29.exe'.

Additional information: Wywołanie funkcji PInvoke 'ComLibrary.ClassExportDLL+FooDelegate::Invoke' zachwiało równowagą stosu. Prawdopodobna przyczyna to niedopasowanie zarządzanego podpisu funkcji PInvoke i niezarządzanego podpisu docelowego. Sprawdź, czy konwencja wywołania i parametry podpisu funkcji PInvoke pasują do niezarządzanego podpisu docelowego.

Jaki "CallConversion" jest dla funkcji "myFooDelegate" ?


public delegate bool FooDelegate(string data);

    [DllExport("DoSendCallbackFunction", CallingConvention = CallingConvention.StdCall)]
    public static bool DoSendCallbackFunction(IntPtr callback)
    {
        FooDelegate myFooDelegate = (FooDelegate)Marshal.GetDelegateForFunctionPointer(callback,typeof(FooDelegate));
        string theString = "This is the data!!";
        myFooDelegate(theString);

        return true;
    }
0

a co masz w dll?

0

https://github.com/mariuszmaximus/testDLLExport

Po stronie Delphi

type
TProcCallback = procedure (p_int: integer); cdecl;

Po stronie C#

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void TProcCallback(int dane);
0

I dopiero teraz to zauważyłem :)
cdecl mam w delphi
a StdCall w C#

0

jeśli będziesz używał biblioteki w innych środowiskach to najbezpieczniejsza i najbardziej uniwersalna jest konwencja stdcall

1 użytkowników online, w tym zalogowanych: 0, gości: 1