2016-05-16 52 views
0

請按照本教程here但沒有成功。返回內存地址錯誤。在C#中返回字符串數組並獲取delphi [Interop]

我想這樣的,不是我的內存錯誤,但返回空值

代碼德爾福:

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. 

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; 
     } 

別人的代碼已經通過該走了問題?

謝謝

+1

很多方法。此代碼無法工作。德爾福的陣列和字符串不是國際刑警組織的安全。如果你的代碼是純粹的Delphi,那麼你的代碼甚至不會工作,因爲你按值傳遞數組。例如,您可以將列表編碼爲JASON。或者你可以一次返回一個字符串。 –

+0

或者您可以簡單地在您建議的問題上做出答案。很明顯,爲什麼你沒有遵從那裏的建議,並且制定出自己的代碼超出了我的想象。 –

+0

一次返回一個字符串是一個好主意。我明天會考。 Tks –

回答

1

我會把問題分解成3部分。

  1. 獲取整理出的調用約定。 Stdcall和cdecl是互斥的調用約定。您需要絕對確定調用.dll的約定,然後調整您的應用程序代碼以匹配。 https://en.wikipedia.org/wiki/X86_calling_conventions

  2. 做一個只需要一個字符串(不是數組)的簡單測試過程。您需要確保字符集(Ansi與Unicode)和字符串長度確定(BStr與LPStr)。

  3. 一旦處理了這兩個問題,然後處理原始數組 的參數。

+2

如何解決第3項是真正的問題。請告訴我們該怎麼做,或者這不是一個答案。 –

相關問題