2016-10-11 7 views
2

I Unmanaged Exports NuGet von Robert Giesecke bin mit und die folgende Methode in C#:Rückgabe eines String-Array von C# zu Inno Setup

[DllExport("DummyMethod", CallingConvention = CallingConvention.StdCall)] 
public static void DummyMethod(
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] out string[] test, out int count) 
{ 
    count = 3; 
    test = new[] {"test1", "test2", "test3"}; 
} 

In Inno Setup dies ist mein Code:

[Code] 
procedure DummyMethod(out Test: TArrayOfString; out Count: Integer); 
external '[email protected]:MyDll.dll stdcall'; 

procedure InitializeWizard(); 
    var Test : TArrayOfString; 
    var Count : Integer; 
begin 
    DummyMethod(Test, Count); 
    MsgBox(Test[0], mbError, MB_OK); 
end; 

Aus irgendeinem Grund ist Count immer 0 und Test ist immer leer.

Ich habe mir einige Beispiele angesehen, konnte aber keine finden, bei denen Inno Setup ein String-Array von einer C# DLL holt.

Antwort

2

Die UnmanagedType.LPArray mit string bildet auf ein Array von Zeigern zu char (C-style char**). In Unicode Pascal Script ist das array of PAnsiChar. Es gibt keine Möglichkeit, dass das Pascal-Skript das auf magische Weise in TArrayOfString (array of string) konvertieren kann.

Sie können es wie folgt konvertieren:

type 
    TArrayOfPAnsiChar = array of PAnsiChar; 

procedure DummyMethod(out StringPtrs: TArrayOfPAnsiChar; out Count: Integer); 
    external '[email protected]:ArrayInno.dll stdcall'; 

function DummyMethodWrapper: TArrayOfString; 
var 
    ArrayOfPAnsiChar: TArrayOfPAnsiChar; 
    I, Count: Integer; 
begin 
    DummyMethod(ArrayOfPAnsiChar, Count); 

    SetArrayLength(Result, Count); 
    for I := 0 to Count - 1 do 
    begin 
    Result[I] := ArrayOfPAnsiChar[I]; 
    end; 
end; 

(Getestet mit Unicode Inno Setup)


Side Hinweise:

  • Es ist nicht klar, wer eine tut Speicherzuweisung für die TArrayOfAnsiChar und einzelne Zeichenfelder. Ich rieche bestenfalls ein Speicherleck.
  • Sie möchten wahrscheinlich 16-Bit-Zeichenpuffer, nicht 8-Bit-Zeichenpuffer verwenden, um vollständigen Unicode zu ermöglichen. Beachten Sie jedoch, dass dies im Pascal-Skript schwieriger zu implementieren ist, da es keinen 16-Bit-Zeichen-Zeigertyp gibt.
+2

Ihre Antwort war sehr hilfreich und der mitgelieferte Code funktioniert perfekt. Die Umwandlung von string [] nach char ** macht in der Tat Sinn. Ich habe nicht viel Erfahrung mit dieser Art von Setups und mein Wissen über verwalteten Code ist ziemlich begrenzt. Ich musste von Nicht-Unicode zu Unicode-Inno-Setup wechseln, aber ich halte das für eine gute Sache! :) – breez