Как вернуть строку с null-terminated символом в середине из delphi dll в c#?

Рейтинг: 2Ответов: 1Опубликовано: 20.11.2014

delphi:

function Test(): PChar; stdcall;
var
  LocalStr: String;
begin
  LocalStr:= 'Test string with'+ #0 + 'null-terminated in body';
  Result:= CoTaskMemAlloc(SizeOf(Char) * Length(LocalStr) + 1);
  StrLCopy(Result, PChar(LocalStr), Length(LocalStr));
end;

c#:

[DllImport(@"путь к dll", CharSet = CharSet.Unicode)]
public static extern string Test();

Возвращается только "Test string with". Оно и понятно, так как тип возврата PChar. А вот как вернуть целиком такую строку, я не знаю.

Ответы

▲ 4Принят

Всё оказалось очень интересно. Это особенность среды delphi:

function Test(Text: WideString): WideString; stdcall;
var
  LocalStr: String;
begin
  LocalStr:= 'Test string with'+ #0 + 'null-terminated in body';
  Result := localStr;
end;

И теперь самое интересное (обратите внимание что первым аргументом должен идти out парамтр) c#:

[DllImport(@"путь к dll", CharSet = CharSet.Unicode)]
public static extern void Test([MarshalAs(UnmanagedType.BStr)] out string Result, [MarshalAs(UnmanagedType.BStr)] string text);