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

Тема в разделе "Delphi - Система", создана пользователем FixeR, 21 авг 2010.

  1. FixeR

    FixeR Гость

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

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

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

    evg2108 Гость

    Прочитай тут полностью
    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/
     
  3. FixeR

    FixeR Гость

    Спасибо большое.
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Все зависит от приложения которое юзает DLL-ку.
    А точнее - главное обеспечить совместимость типов данных.
    Если вы говорите basic у вас, то должно быть приблизительно так:

    Код (Delphi):
    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;
     
Загрузка...

Поделиться этой страницей