Einzelnen Beitrag anzeigen

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, 12: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