Мы пытаемся передать строку от собственной программы Delphi до Призмы Delphi DLL. У нас нет проблемы, передающим целым числам, но строкам не соответствуют в DLL. Мы видели фрагмент кода Robert Love в ответ на другой вопрос, но нет никакого кода для собственной программы Delphi.
Как мы можем передать строки от Delphi до Призмы Delphi DLL?
seteuid (некоторый случайный uid)
для удаления привилегий, seteuid (0)
для их возврата при выполнении как root
.
На мой взгляд, да, отправка любых данных обратно, которые не авторизованы, является неэтичной. Большинство программных обеспечений предложат вам спросить, нормально ли отправлять анонимные данные об использовании. Вы также можете отслеживать загрузки и оценивать, сколько из них действительно установлено.
-121--2093510-Наилучшим способом было бы использование WeyString.
По нескольким причинам.
В 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 (в зависимости от исходной системы разработки) возникнут исключения
Строки в Delphi Win32 управляются иначе, чем строки в .Net, поэтому вы не можете передать строку из .Net в Delphi Win32 или наоборот.
Для обмена строковыми значениями лучше использовать тип PChar, который поддерживается обоими компиляторами. Это тот же способ, которым вы передаете строковые значения функциям Windows API.
С уважением
P.S. Я НЕ Роберт ;-)