![]() |
Delphi DLL Schnittstelle zu C#
Ich habe eine Test-Schnittstelle von Delphi nach C# geschrieben.
Hier ist der Delphi Code der DLL:
Code:
Hier der C# Code:type ITest = interface ['{D032F796-167D-4B0D-851D-2AEEA226646A}'] Function GetTest : Integer; stdcall; Procedure SetTest(value : integer); stdcall; end; TTest = class(TInterfacedObject, ITest) public Function GetTest : Integer; stdcall; export; public Procedure SetTest(value : integer); stdcall; export; public Test: integer; end; Function TTest.GetTest() : Integer; stdcall; export; begin result := Test; end; Procedure TTest.SetTest(value : Integer); stdcall; export; begin Test := value; end; function GetTest() : TTest; stdcall; export; begin Result := TTest.Create; end; exports GetTest; end.
Code:
Wäre extrem dankbar, wenn sich jemand den Code durchlesen und auf Fehler überpfüfen könnte.
namespace WpfApplication1
{ public partial class MainWindow : Window { [ComImport, Guid("2B4AD756-C379-4BAB-9804-72E9A9E0B26F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface ITest { [MethodImplAttribute(MethodImplOptions.PreserveSig)] [return: MarshalAs(UnmanagedType.U1)] void SetTest(int value); [MethodImplAttribute(MethodImplOptions.PreserveSig)] [return: MarshalAs(UnmanagedType.U1)] int GetTest(); } public abstract class TTest : ITest { public abstract void SetTest(int value); public abstract int GetTest(); } [DllImport("Schnittstellen_1.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] public static extern TTest GetTest(); public MainWindow() { InitializeComponent(); } private void Window_Initialized(object sender, EventArgs e) { GetTest().SetTest(2); MessageBox.Show(GetTest().GetTest().ToString()); } } } Fehlermeldung in VisualStudio: In System.Runtime.InteropServices.COMException ist eine Ausnahme aufgetreten. Unbekannter Fehler(Ausnahme von HRESULT: 0x80004005(E_FAIL)) |
AW: Delphi DLL Schnittstelle zu C#
Was mir noch auffällt warum zwei unterschiedliche GUIDS für das gleiche Interface ??
ITest C# Guid("2B4AD756-C379-4BAB-9804-72E9A9E0B26F") ITest Delphi ['{D032F796-167D-4B0D-851D-2AEEA226646A}'] gruss |
AW: Delphi DLL Schnittstelle zu C#
Danke vielmals
Werd's später nochmals versuchen;D |
AW: Delphi DLL Schnittstelle zu C#
Könntest du mir eventuell noch den vollständigen Code schicken?
(Mit Deklarationen) Danke im Voraus TTF |
AW: Delphi DLL Schnittstelle zu C#
Zitat:
Verstehe nicht was du damit meinst. Meine Dll ist Closed Source abgesehen von ein paar Schnipseln daraus. Sorry. gruss |
AW: Delphi DLL Schnittstelle zu C#
Jetzt wo du deinen Source code herausgenommen hast kann ich es dir logischerweise nicht erklären. Ich habe ihn nicht abgespeichert.
|
AW: Delphi DLL Schnittstelle zu C#
Zitat:
Die kleine DLL und das WPF Projekt so das ich es mal hier kompilieren und ändern/ausführen kann. gruss |
AW: Delphi DLL Schnittstelle zu C#
Liste der Anhänge anzeigen (Anzahl: 1)
Cool danke!:thumb:
|
AW: Delphi DLL Schnittstelle zu C#
Zitat:
Zitat:
Zitat:
|
AW: Delphi DLL Schnittstelle zu C#
Liste der Anhänge anzeigen (Anzahl: 1)
Oh Entschuldigung
Hier ist das Projekt: |
AW: Delphi DLL Schnittstelle zu C#
Habe alle mir bekannten Möglichkeiten ausgeschöpft
komme leider zu keinem Ergebnis. Vielleicht hilft dir dieser Beitrag weiter. ![]() Letzter Beitrag. Sorry :cry: gruss |
AW: Delphi DLL Schnittstelle zu C#
Ohne mich mit der Problematik näher auseinander zu setzen:
Sollte GetTestClass nicht "ITest" liefern statt "TTest"? Schließlich kennt nur die DLL die konkrete Klasse. |
AW: Delphi DLL Schnittstelle zu C#
Danke hab ich probiert. Dann weiss ich halt einfach nicht was ich damit in C# anfangen soll. Ich kann ja kein Objekt davon erzeugen oder so...
Ich wäre sehr froh, wenn du dir den C# Code noch einmal angucken könntest...Ich habe irgendwie immer mehr das Gefühl, dass nicht allzu viel von dem Sinn ergibt:oops::lol: Herzlichen Dank an EWeiss für seine Bemühungen. |
AW: Delphi DLL Schnittstelle zu C#
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:
Außerdem, woher hast du denn das mit dem UnmanagedType.U1?
[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); 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:
Dann würde das Interface in C# so aussehen:
ITest = interface
['{D032F796-167D-4B0D-851D-2AEEA226646A}'] function GetTest : Integer; safecall; procedure SetTest(value : integer); safecall; end;
Code:
Wenn du es so lassen willst wie jetzt, würde man es in C# trotzdem als property mappen:
[ComImport, Guid("D032F796-167D-4B0D-851D-2AEEA226646A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest { int Test { get; set; } }
Code:
btw, du hast da EINIGE Dinge eingebaut, die da überhaupt nicht hingehören:
[ComImport, Guid("D032F796-167D-4B0D-851D-2AEEA226646A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest { int Test { [MethodImplAttribute(MethodImplOptions.PreserveSig)] get; [MethodImplAttribute(MethodImplOptions.PreserveSig)] set; } }
|
AW: Delphi DLL Schnittstelle zu C#
Wow danke!!!!:lol::lol::thumb::corky::chat:
Du bist genial:thumb: Funzt perfekt !Da verfliegt doch der Ärger über meine blöden Fehler schnell:roll::wall: |
AW: Delphi DLL Schnittstelle zu C#
Zitat:
@Elvis :thumb: War dann doch der richtige Beitrag den ich verlinkt habe. Na dann! Schön das es nun funktioniert. gruss |
AW: Delphi DLL Schnittstelle zu C#
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz