2016-05-16 18 views
0

Folgen Sie diesem Tutorial here, aber kein Erfolg. Fehler bei der Speicheradresse zurückgeben.Array von String in C# zurückgeben und Delphi [Interop] erhalten

Ich versuche, dies zu mögen, nicht mir die Speicherfehler, sondern kehrt nulls

-Code Delphi:

interface 
    procedure getValores(samples: array of string); stdcall; external 'myDll.dll'; 

procedure TForm1.Button1Click(Sender: TObject); 
    var 
     vet :array[0..400] of string; 
    begin 
     getValues(vet); 
     Layout('',vet); 
    end; 

    end. 

Code of C#

 [DllExport(CallingConvention = CallingConvention.Cdecl)] 
     public static void getValores(
      [Out] 
      [MarshalAs(UnmanagedType.LPArray, 
      ArraySubType=UnmanagedType.LPWStr, SizeConst=400)] 
      String[] test 
      ) 
     { 
      if (test == null) 
      { 
       MessageBox.Show("null"); 
       return; 
      } 
      MessageBox.Show("Recive" + test.Length); 

      for(int i = 0; i < test.Length; i++) 
       test[i] = "test"; 

      return; 
     } 

jemand durchgegangen Problem?

Vielen Dank

+1

Viele Möglichkeiten. Dieser Code kann nicht funktionieren. Arrays und Strings in Delphi sind nicht Interpol sicher. Ihr Code wird nicht einmal funktionieren, wenn es reines Delphi war, weil Sie das Array nach Wert übergeben. Sie könnten die Liste beispielsweise als JASON codieren. Oder Sie könnten jeweils einen String zurückgeben. –

+0

Oder Sie könnten einfach tun, was die Antwort auf die Frage, die Sie verlinkt, empfiehlt. Warum hast du dem Rat nicht gefolgt und deinen eigenen Code erfunden? –

+0

Eine Zeichenfolge auf einmal zurückgeben ist eine gute Idee. Ich werde morgen testen. Tks –

Antwort

1

Ich würde das Problem in 3 Teile zerlegen.

  1. Erhalten Sie die Aufrufkonventionen aussortiert. Stdcall und Cdecl sind sich gegenseitig ausschließende Aufrufkonventionen. Sie müssen absolut sicher sein, die Konvention der .dll aufzurufen, und passen Sie dann Ihren Anwendungscode entsprechend an. https://en.wikipedia.org/wiki/X86_calling_conventions

  2. Machen Sie eine einfache Testprozedur, die nur eine Zeichenfolge (kein Array) benötigt. Sie müssen den Zeichensatz (Ansi vs. Unicode) und die String-Längenbestimmung (BStr vs. LPStr) überprüfen.

  3. Sobald diese beiden Probleme behandelt werden, dann behandeln Sie das ursprüngliche Array Argument.

+2

Wie Sie Punkt 3 lösen, ist das eigentliche Problem. Bitte sagen Sie uns, wie das geht, oder das ist keine Antwort. –