2016-05-16 66 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项是真正的问题。请告诉我们该怎么做,或者这不是一个答案。 –