Как я могу передать строку Delphi Призме DLL?

Мы пытаемся передать строку от собственной программы Delphi до Призмы Delphi DLL. У нас нет проблемы, передающим целым числам, но строкам не соответствуют в DLL. Мы видели фрагмент кода Robert Love в ответ на другой вопрос, но нет никакого кода для собственной программы Delphi.

Как мы можем передать строки от Delphi до Призмы Delphi DLL?

5
задан Community 23 May 2017 в 12:33
поделиться

2 ответа

seteuid (некоторый случайный uid) для удаления привилегий, seteuid (0) для их возврата при выполнении как root .

-121--2948863-

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

-121--2093510-

Наилучшим способом было бы использование WeyString.

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

  • Это Юникод и работает до 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 (в зависимости от исходной системы разработки) возникнут исключения

8
ответ дан 14 December 2019 в 01:07
поделиться

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

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

С уважением

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

1
ответ дан 14 December 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: