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

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

FixeR

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

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

В dll:
Код:
function test (path: ShortString): Pchar; stdcall;
begin
result := Pchar('123');
end;

Т.е. как видно, в dll надо ещё и передать string.
Кто-нибудь решал такую проблему?
 
Прочитай тут полностью
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/
 
Спасибо большое.
 
Пишу простенькую 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;
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab