2016-05-16 9 views
0

Следуйте этому руководству here, но не получится. Ошибка адресной памяти.Возвратите массив String в C# и получите delphi [Interop]

Я пытаюсь это нравится, а не я ошибка памяти, но возвращает NULLS

код 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

Много способов. Этот код не может работать. Массивы и строки в Delphi не являются безопасными для Интерпола. Ваш код даже не работает, если он был чистым Delphi, потому что вы передаете массив по значению. Вы можете кодировать список как JASON, например. Или вы можете вернуть одну строку за раз. –

+0

Или вы могли бы просто сделать то, что ответ на вопрос, который вы связали с рекомендациями. Почему бы вам не следовать советам и составить свой собственный код вне меня. –

+0

Возвращение строки за раз - хорошая идея. Я буду тестировать завтра. Tks –

ответ

1

Я сломал бы проблему на 3 части.

  1. Получить согласованные соглашения. Stdcall и cdecl являются взаимоисключающими соглашениями о вызовах. Вы должны быть абсолютно уверены в том, чтобы называть соглашение .dll, а затем корректировать свой код приложения для соответствия. https://en.wikipedia.org/wiki/X86_calling_conventions

  2. Простая процедура проверки, в которой используется только одна строка (а не массив). Вам нужно будет убедиться в наборе символов (Ansi vs. Unicode) и определении длины строки (BStr vs. LPStr).

  3. Как только эти две проблемы обрабатываются, обратитесь к исходному массиву аргументов .

+2

Как решить пункт 3 является реальной проблемой. Расскажите, пожалуйста, как это сделать, или это не ответ. –