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) = '
cool'
then
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