AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Einbindung von externen DLLs in Delphi

Ein Thema von Rabenrecht · begonnen am 30. Jun 2017 · letzter Beitrag vom 4. Jul 2017
Antwort Antwort
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Einbindung von externen DLLs in Delphi

  Alt 30. Jun 2017, 13:57
Edit: bin mir nicht sicher, ob das Thema im passenden Unterforum ist. Wenn nicht, gerne dahin verschieben, wo es besser passt

Das ist absolutes Neuland für mich und nach meiner bisherigen Recherche kann man dabei jede Menge falsch machen.

Daher frage ich lieber bei euch Experten hier nach


Der Sachverhalt: Ich möchte in Delphi eine Funktion einer von mir in C#* geschriebenen Klassenbibliothek aufrufen.

Auf C# Seite sieht das folgendermaßen aus:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RGiesecke.DllExport;
using System.DirectoryServices;
using System.Runtime.InteropServices;

namespace MyClassLib
{
    public class Class1
    {
        [DllExport("MyCoolFunc", CallingConvention = CallingConvention.StdCall)]
        [return: MarshalAs(UnmanagedType.BStr)]
        public static string MyCoolFunc(String path, String filter, String[] attributes, String[] fieldNames, int depth)
        {
            //STUFF
           ...
           Return = "cool";
        }
    }
}
Zum Exportieren verwende ich das NuGet-Paket UnmanagedExports von Robert Gieseke.

Die Frage ist nun, wie man die Sachen in Delphi einbindet. Nachdem, was ich bisher gelesen habe, müsste das folgendermaßen aussehen:

Delphi-Quellcode:
type
  TCoolClass = class
  private
    function CoolFunction(path, filter: String; attributes, fieldNames: Array of String; depth: integer):WideString; stdcall;
  public
    function TestIfCool:Boolean;
  end;

implementation

function TCoolClass.CoolFunction; external "MyClassLib.dll";

function TCoolClass.TestIfCool:Boolean;
var
  vPath,
  vFilter : String;
  vAttributes,
  vFieldNames : Array of String;
  vDepth : Integer;
begin
  vPath := 'DC=foo,DC=bar';
  vFiler := '(&(Name=foobar))';
  SetLength(vAttributes,2);
  vAttributes[0] := 'foo';
  vAttributes[1] := 'bar';
  SetLength(vFieldNames,2);
  vFieldNames[0] := 'FOO';
  vFieldNames[1] := 'BAR';
  vDepth := 2;

  if CoolFunction(vPath,vFilter,vAttributes,vFieldNames,vDepth) = 'coolthen
    return := true
  else
    return := false;
end;
Aber so einfach wird es denke ich nicht sein. Die Frage, die sich mir am stärksten aufdrängt, ist die nach der Kompatibilität der Typen: CoolFunc hat als Parameter String, Integer und String Arrays. In C# gibt es natürlich Entsprechungen, aber jeder Programmiersprache implementiert diese Typen ja auf eigene Weise. Da könnte es schon zu Problemen kommen.

Welche Typen sollte ich bei externen Aufrufen also nach Möglichkeit nur verwenden? Sind Datenstrukturen wie Arrays bei sowas überhaupt möglich?

Das ganze Thema ist wie gesagt komplett neu für mich, daher freue ich mich über jeden Input

*dass ich C# für die Implementierung verwendet habe, dürfte hier ziemlich unerheblich sein, da sich meine Fragen für zb. VB oder c++ genauso stellen würden
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Einbindung von externen DLLs in Delphi

  Alt 30. Jun 2017, 15:07
Du sagst beim Rückgabewert ja schon, dass es ein BStr sein soll, das müsste auch für die Eingangsargumente gelten ([return: MarshalAs(UnmanagedType.BStr)]).
Auf Delphi-Seite dann den Typ WideString anstatt String nehmen.
  Mit Zitat antworten Zitat
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Einbindung von externen DLLs in Delphi

  Alt 4. Jul 2017, 16:04
Hat geklappt

Zusätzlich zum Marshallen der Parameter musste ich allerdings anstatt eine Rückgabewert zu verwenden einen "out" Parameter nutzen.

Bei Rückgabetypen, die man nicht marschallen braucht (wie Int), ging es auch so, aber Strings wurden immer "verschluckt".
  Mit Zitat antworten Zitat
Alt 21. Aug 2019, 11:14     Erstellt von minion89
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Alt 18. Apr 2023, 11:58     Erstellt von reacal
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz