Как передать строку Delphi в библиотеку Prism DLL? - PullRequest
5 голосов
/ 16 февраля 2010

Мы пытаемся передать строку из нативной программы Delphi в DLL-библиотеку Delphi Prism. У нас нет проблем с передачей целых чисел, но строки в DLL не совпадают. Мы увидели фрагмент кода Роберта Лава в ответ на другой вопрос, но кода для нативной программы Delphi нет.

Как мы можем передать строки из Delphi в DLL-библиотеку Delphi Prism?

Ответы [ 2 ]

8 голосов
/ 16 февраля 2010

Лучший способ - использовать WideString.

По нескольким причинам.

  • Это Unicode и работает до D2009
  • Это память управляется в ole32.dll, поэтому не зависит ни от менеджера памяти Delphi, ни от CLR GC.
  • Вам не нужно напрямую иметь дело с указателями

В Oxygene вы можете написать это так:

type
  Sample = static class
  private
    [UnmanagedExport]
    method StringTest([MarshalAs(UnmanagedType.BStr)]input : String;
                      [MarshalAs(UnmanagedType.BStr)]out output : String);
  end;

implementation

method Sample.StringTest(input : String; out output : String);
begin
  output := input + "ä ~ î 暗";
end;

"MarshalAs" говорит CLR, как собирать строки взад и вперед. Без этого строки передаются как Ansi (PAnsiChar), что, вероятно, НЕ , что вы хотели бы сделать.

Вот как использовать его из Delphi:

procedure StringTest(const input : WideString; out output : WideString);
  stdcall; external 'OxygeneLib';

var
  input, output : WideString;
begin
  input := 'A b c';
  StringTest(input, output);
  Writeln(output);
end.

Кроме того, никогда не используют типы, которые не определены четко, для внешних интерфейсов. Вы не должны использовать PChar для импорта или экспорта DLL. Потому что, если вы это сделаете, вы столкнетесь с исключениями при компиляции с D7 или D2009 (в зависимости от того, какой была оригинальная система разработки)

1 голос
/ 16 февраля 2010

Строки в Delphi Win32 управляются иначе, чем строки в .Net, поэтому вы не можете передать строку .Net в Delphi Win32 или наоборот.

Для обмена строковыми значениями лучше использовать тип PChar, который поддерживается обоими компиляторами. Таким же образом вы отправляете строковые значения в функции Windows API.

Привет

P.S. Я НЕ Роберт; -)

...