powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Возврат String из FPC dll
11 сообщений из 11, страница 1 из 1
Возврат String из FPC dll
    #39758258
Janex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.
Дёргаю из Delphi (10.3) приложения dll-кy написаную на FPC (3.х.х).
Передать String параметри В dll знаю как, но как обратно
получить String?

Примерно так на Delphi:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
Type
  TMyFunction = function: PWideChar; CDecl;
Var 
  MyFunction :TMyFunction;

Function CallMyFunction: String;
begin 
  Result := ЧтоТоКакто(MyFunction);
end;


Примерно так на FPC:
Код: pascal
1.
2.
3.
4.
5.
Function MyFunction: PChar; Export; CDecl;
Var S :String;
Begin
  Result := ЧтоТоКакто(S);
End;


Что тук и как правильно делать?
Или хотябы как сделать процедуру где что то возврашается через входные параметри: "Var Argument :PWideChar" ?

WBR
Janex
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39758263
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И туда и обратно нужно делать через выделенный заранее буфер, который уничтожается после вызова процедуры/функции.

Как это сделано в windows api.
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39758273
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Janex, Используй widestring и передавай в параметрах функции, и никогда не передавай в результате функции.
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39758309
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JanexПривет всем.
Дёргаю из Delphi (10.3) приложения dll-кy написаную на FPC (3.х.х).
Передать String параметри В dll знаю как, но как обратно
получить String?

...
String - нельзя. Разные менеджеры памяти, возможно - разные реализации строк.

В функцию передавай указатель на буфер (PChar, например), в который функция должна упаковать результат.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
// dll:
procedure GetMyF(var aStr : pChar; len : integer); export;
var
  fS : string;
begin
  fS := 'Привет'+ ', ' + 'Янекс!';
  CopyMemory(aStr, PChar(fS), Min(Length(fS) * SizeOf(Char) , len) - SizeOf(Char));
end;

//exe:
var
  fpStr: PChar;
begin
  fpStr := AllocMem(10);
  GetMyF (fpStr, 10);
  ShowMessage(fpStr);
  FreeMem(fpStr);




Или пусть буфер создается в dll, но тогда и dll пусть экспортирует функцию, освобождающую память буфера.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
// dll:
function MyF() : PChar; export ;
var
  fS : string;
begin
  fS := 'Привет'+ ', ' + 'Янекс!';
  Result := AllocMem(Length(fS) * SizeOf(Char) + 1);
  CopyMemory(Result, PChar(fS), Length(fS) * SizeOf(Char));
end;

procedure FreeDllStr(aStr : PChar); export;
begin
  freeMem(aStr);
end;

// exe:
..
var
  fStr : pChar;

begin
  fStr := MyF();
  ShowMessage(fStr);
  FreeDllStr(fStr);
end;
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39758322
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinAPI отличный пример для подражания. Есть как предвыделенные вызывателем буферы, так и выделение DLL-ю с последующим обязательным освобождением. Также есть режимы, возвращающие необходимую длину буфера.
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39758410
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как раз с WideString все хорошо: достаточно использовать SysAllocString
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39759066
Janex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл Эра,

Всё вроде как работает, спасибо, но некак немогу понять как и что в FPC делать чтоб
в дельфовскии екзешник передать юникод, типо UTF8.
Вот FPC:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
Function  MyFunc: PUTF8Char; Export; CDecl;
Var S :UTF8String;
Begin
  S := 'Test test Женя';
  Result := AllocMem(Length(S) * SizeOf(UTF8Char) + 1);
  Move(PUTF8Char(S)^, Result^, Length(S) * SizeOf(UTF8Char));
end;   



Delphi екзешник:

Код: pascal
1.
2.
3.
4.
5.
6.
Function Test: String;
Var S :PUTF8Char;
Begin
  s := MyFunc;
  Result :=  S;
End;




Там где "Test test" там всё прекрасно, а остальное крякобразы :(
Как правильно сморматировать, передать и отобразить UTF8 ?
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39759077
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Janex,

ну ты блин даешь. Отдаешь utf8 строку, а хочешь, чтобы она стала utf16. Сама собой она не перекодируется.
Перекодируй сам. Или в dll, или в exe.

Например, http://wiki.freepascal.org/Unicode_Support_in_Lazarus
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39759078
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Janex,

Код: pascal
1.
  Result := AllocMem(Length(S) * SizeOf(UTF8Char) + 1);


Я не уверен в правильности такого кода. Длина символа utf8 составляет от 1 до 4 байт:
https://ru.wikipedia.org/wiki/UTF-8
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39759130
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл Эра,

Не бойся, больше 2 негров ещё нигде не используется.
...
Рейтинг: 0 / 0
Возврат String из FPC dll
    #39759201
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл ЭраJanex,

Код: pascal
1.
  Result := AllocMem(Length(S) * SizeOf(UTF8Char) + 1);


Я не уверен в правильности такого кода. Длина символа utf8 составляет от 1 до 4 байт:
https://ru.wikipedia.org/wiki/UTF-8
В данном случае это нормально. Length(Utf8String) считает в байтах, а не символах
JanexТам где "Test test" там всё прекрасно, а остальное крякобразы :(
Как правильно сморматировать, передать и отобразить UTF8 ?
Result := string(Utf8String(S));
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Возврат String из FPC dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]