Функция в Dll, возвращающая строку

  • Автор темы FixeR
  • Дата начала
F

FixeR

#1
Пишу простенькую dll под delphi 7.
Библиотека подключается к проекту на VB.

Проблемы начались при попытке вернуть string.
Почитал, оказывается у delphi с этим всё плохо, нужно либо подключать ShareMem (но это бред вобще), либо вместо типа string использовать что-то другое.

В dll:
Код:
function test (path: ShortString): Pchar; stdcall;
begin
result := Pchar('123');
end;
Т.е. как видно, в dll надо ещё и передать string.
Кто-нибудь решал такую проблему?
 
E

evg2108

#2
Прочитай тут полностью
http://www.cyberguru.ru/programming/delphi...ails-page8.html

а так же тут http://www.sources.ru/magazine/0804/delphistr.html
В конце написано про альтернативу ShareMem - FastShareМem типа модуль, который позволяет обойтись без подключения BORLNDMM.DLL.

Так же в одной из этих статей написано про то, что для передачи параметров и возврата результатов можно использовать WideString вместо AnsiString (в первой статье), тогда не надо будет заморачиваться ни с какими ShareMem`ами. Будет немного медленнее чем AnsiString из за конвертации в юникод, но не сильно... В общем читай. Вторая статья тоже очень познавательна.

Вот ещё по той же теме
http://delphist.ru/widestring-dll/
 

sinkopa

Well-known member
17.06.2009
344
4
#4
Пишу простенькую dll под delphi 7.
Библиотека подключается к проекту на VB.

Проблемы начались при попытке вернуть string.
Почитал, оказывается у delphi с этим всё плохо, нужно либо подключать ShareMem (но это бред вобще), либо вместо типа string использовать что-то другое.

В dll:
Код:
function test (path: ShortString): Pchar; stdcall;
begin
result := Pchar('123');
end;
Т.е. как видно, в dll надо ещё и передать string.
Кто-нибудь решал такую проблему?
Все зависит от приложения которое юзает DLL-ку.
А точнее - главное обеспечить совместимость типов данных.
Если вы говорите basic у вас, то должно быть приблизительно так:

Код:
function test (path: PWideChar): PWideChar; stdcall; // экспортируемая из DLL функция

var
str: WideString;	 // Поскольку у нас DLL !обязательно! нужна глобальная переменная
// т.к. после того как функция отработает, result станет nil
implementation

function test (path: PWideChar): PWideChar;
var
W: WideString;
begin
str := '';	  // Инициализировали переменную
W := path;  // "заглянули" в область памяти вызывающего приложения

SetLength(W,Length(W)); // Заставили создать собственную (в области памяти DLL)
// локальную копию строчки (со своим счетчиком ссылок)
// что то делаем...
if FileExists(W) then
begin
str := '123'+ ExtractFileName(W);
end;
Result := PWideChar(str); // вернули вызывающему приложению адрес
end;