Wie kann ich (oder wenn ich nicht) verwenden Varianten auf einfache DLLs?
-
13-09-2019 - |
Frage
Ich möchte einige Funktionen eines internen Objekt als DLL belichten - aber diese Funktionalität nutzt Varianten. Aber ich muß wissen: Ich habe eine Funktion mit Variant-Parametern exportieren und / oder Rücklauf - oder besser ist, zu einer String-Darstellung nur gehen?
Was ist besser, aus sprachunabhängig POV (der Verbraucher nicht mit Delphi gemacht - aber alle werden in Windows ausgeführt wird)
?Lösung
könnten Sie verwenden OleVariant, die die Variante Werttyp ist, die von COM verwendet wird. Achten Sie darauf, nicht als Funktionsergebnis als stdcall und komplexe Ergebnistypen zurückkehren kann leicht zu Problemen führen.
Ein einfaches Beispiel Bibliothek DelphiLib;
uses
SysUtils,
DateUtils,
Variants;
procedure GetVariant(aValueKind : Integer; out aValue : OleVariant); stdcall; export;
var
doubleValue : Double;
begin
case aValueKind of
1: aValue := 12345;
2:
begin
doubleValue := 13984.2222222222;
aValue := doubleValue;
end;
3: aValue := EncodeDateTime(2009, 11, 3, 15, 30, 21, 40);
4: aValue := WideString('Hello');
else
aValue := Null();
end;
end;
exports
GetVariant;
Wie es aus C # verbraucht werden:
public enum ValueKind : int
{
Null = 0,
Int32 = 1,
Double = 2,
DateTime = 3,
String = 4
}
[DllImport("YourDelphiLib",
EntryPoint = "GetVariant")]
static extern void GetDelphiVariant(ValueKind valueKind, out Object value);
static void Main()
{
Object delphiInt, delphiDouble, delphiDate, delphiString;
GetDelphiVariant(ValueKind.Int32, out delphiInt);
GetDelphiVariant(ValueKind.Double, out delphiDouble);
GetDelphiVariant(ValueKind.DateTime, out delphiDate);
GetDelphiVariant(ValueKind.String, out delphiString);
}
Andere Tipps
Soweit ich weiß, gibt es keine Probleme mit Variant Variablentyp in anderen Sprachen zu arbeiten. Aber es wird groß sein, wenn Sie die gleichen Funktionen für unterschiedliche Variablentypen exportieren.