Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#14

AW: Delphi DLL Schnittstelle zu C#

  Alt 18. Jul 2014, 11:31
Man sollte aufpassen, wenn man mit Delphi sdtcall benutzt.
Delphi übergibt rückgabewerte anders, als es unter Windows eigenetlich sein sollte.
Es ist deshalb angebracht diese als out-Parameter zurückzugeben:

Delphi-Quellcode:
procedure GetTestClass(out value : ITest); stdcall; export;
begin
  value := TTest.Create;
  value.SetTest(5);
end;

Code:
[DllImport("Schnittstellen_1", EntryPoint = "GetTestClass", SetLastError = true)]
public static extern void GetTest(out ITest value);

public static void Main()
{
    ITest test;
    GetTest(out test);
    Debug.Assert(test.Test == 5);
    test.Test = 2;
    Debug.Assert(test.Test == 2);
Außerdem, woher hast du denn das mit dem UnmanagedType.U1?
Ein Integer in Delphi ist binär kompatibel mit einem Int32 in .Net, den man in C# auch "int" nennen kann.

Wenn du in Delphi die Interface-methoden als safecall markierst, wird sie Delphi für dich so ummodeln, dass sie dem HResult-Pattern aus der COM-Welt passen:
Delphi-Quellcode:
ITest = interface
  ['{D032F796-167D-4B0D-851D-2AEEA226646A}']
  function GetTest : Integer; safecall;
  procedure SetTest(value : integer); safecall;
end;
Dann würde das Interface in C# so aussehen:
Code:
[ComImport, Guid("D032F796-167D-4B0D-851D-2AEEA226646A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest
{
    int Test { get; set; }
}
Wenn du es so lassen willst wie jetzt, würde man es in C# trotzdem als property mappen:
Code:
[ComImport, Guid("D032F796-167D-4B0D-851D-2AEEA226646A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest
{
    int Test
    {
        [MethodImplAttribute(MethodImplOptions.PreserveSig)]
        get;
        [MethodImplAttribute(MethodImplOptions.PreserveSig)]
        set;
    }
}
btw, du hast da EINIGE Dinge eingebaut, die da überhaupt nicht hingehören:
  • Deine exportierte Funktion hat keine String, warum also Unicode im DllImport?
  • stdcall ist die nromale CallingConvention, muss da also nicht stehen.
  • Deine Interface-GUIDs waren unterschiedlich, wofür sind den die GUIDs wohl da, wenn nicht um das Interface in beiden System zu identifizieren?
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat