Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как корректно возвращать массив строк из C# в Inno Setup через UnmanagedExports

Delphi , Файловая система , DLL и PlugIns

Иногда разработчикам, работающим с Inno Setup и C# через библиотеку UnmanagedExports, приходится сталкиваться с задачей возврата массива строк из C# кода в код на Object Pascal. В данном руководстве мы рассмотрим, как правильно организовать такой обмен данными.

Проблема

При вызове метода DummyMethod из C# библиотеки в Inno Setup, переменная Test оказывается пустой, а переменная Count всегда равна 0. Это происходит из-за того, что в C# используется UnmanagedType.LPArray для маршалинги массива строк, что в Pascal Script интерпретируется как массив указателей на char, то есть array of PAnsiChar.

Решение

Чтобы решить эту проблему, необходимо преобразовать полученный массив указателей в массив строк. В Inno Setup это можно сделать следующим образом:

type
  TArrayOfPAnsiChar = array of PAnsiChar;

procedure DummyMethod(out StringPtrs: TArrayOfPAnsiChar; out Count: Integer);
  external 'DummyMethod@files:ArrayInno.dll stdcall';

function DummyMethodWrapper: TArrayOfString;
var
  ArrayOfPAnsiChar: TArrayOfPAnsiChar;
  I, Count: Integer;
begin
  DummyMethod(ArrayOfPAnsiChar, Count);

  SetLength(Result, Count);
  for I := 0 to Count - 1 do
  begin
    Result[I] := PChar(ArrayOfPAnsiChar[I]);
  end;
end;

Этот код необходимо использовать в сочетании с Unicode версией Inno Setup, так как он предполагает работу с 16-битными символами.

Важные замечания

  • При работе с указателями на char и индивидуальными массивами символов важно понимать, кто отвечает за выделение памяти и её освобождение. В противном случае существует риск утечки памяти.
  • Для полной поддержки Unicode рекомендуется использовать 16-битные буферы символов, что делает задачу преобразования более сложной в Pascal Script, так как в нём отсутствует тип указателя на 16-битный символ.

Альтернативное решение

В качестве альтернативы, можно использовать маршалинг массива BSTR/WideString, что позволит работать с полным Unicode. В C# коде метод будет выглядеть так:

[DllExport("ReturnsArrayOfStrings", CallingConvention.StdCall)]
public static void ReturnsArrayOfStrings(
    [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.BStr, SizeParamIndex = 1)] out string[] values,
    out int numValues)
{
    values = new[] { "one", "two", "three" };
    numValues = values.Length;
}

А в Inno Setup:

type
  TArrayOfWideString = array of WideString;

procedure ReturnsArrayOfStrings(out values: TArrayOfWideString; out numValues: Integer);
external 'ReturnsArrayOfStrings@files:Thing.dll stdcall';

procedure DoAThing;
var
  values: TArrayOfWideString;
  numValues, i: Integer;
begin
  ReturnsArrayOfStrings(values, numValues);
  for i := 0 to numValues - 1 do
  begin
    Log(values[i]);
  end;
end;

Заключение

В данной статье мы рассмотрели, как правильно работать с массивами строк, возвращаемыми из C# в Inno Setup. Используя предложенные методы, вы сможете корректно обмениваться данными между этими двумя языками программирования.

Создано по материалам из источника по ссылке.

Руководство по правильному возврату массива строк из C# в Inno Setup через UnmanagedExports.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 10:53:04/0.0018370151519775/0