在C#中返回String数组并获取delphi [Interop]

时间:2016-05-16 20:48:48

标签: c# delphi interop delphi-7 com-interop

按照本教程here,但没有成功。返回内存地址错误。

我想要这样,不是我的内存错误,而是返回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.

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 个答案:

答案 0 :(得分:1)

我会将问题分解为3个部分。

  1. 整理出调用约定。 Stdcall和cdecl是互斥的调用约定。您需要完全确定调用.dll的约定,然后调整您的应用程序代码以匹配。 https://en.wikipedia.org/wiki/X86_calling_conventions

  2. 制作一个只需要一个字符串(不是数组)的简单测试程序。您需要确保字符集(Ansi与Unicode)和字符串长度确定(BStr与LPStr)。

  3. 处理完这两个问题后,再处理原始数组 参数。