Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4]      все
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5215
SQL-Talker,
если заменить
BSTR bstr;

на
BSTR bstr=SysAllocString(L"new string");


что будет?
11 июл 19, 16:17    [21925066]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
ziv-2014
Member

Откуда:
Сообщений: 462
SQL-Talker,
Тогда так
typedef BSTR * (__stdcall *Func)(BOOL);

Или в делфи
function GetLastErrText_CH(Check: WordBool): WideString; safecall;

Указатель на строку будет в eax, так что смотри сами.
Лучше передавать данные через параметры, а не как результат функции - так надежнее будет.
11 июл 19, 16:22    [21925071]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 419
kealon(Ruslan)
SQL-Talker,
если заменить
BSTR bstr;

на
BSTR bstr=SysAllocString(L"new string");


что будет?

Тоже самое - падает на вызове функции из DLL
11 июл 19, 16:24    [21925072]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 419
Обернул код в Delphi в try .. except - получается что при вызове этой DLL из C++ там (в dll) вываливается Access Violation

library test_ws_b;

uses
  System.SysUtils,
  Windows,
  Vcl.Dialogs;

function GetLastErrText_CH(Check: BOOL): WideString; stdcall;
begin
  try
    Pointer(Result) := nil;
    if Check then
      Result := 'This is the result of GetLastErrText - TRUE'
    else
      'This is the result of GetLastErrText - FALSE'
     ;
  except
    on E:Exception do
      ShowMessage('Exception in Delphi DLL : ' + E.Message);
  end;
end;

exports
  GetLastErrText_CH;

begin
end.


Спотыкается на строке
Pointer(Result) := nil;

Если ее убрать, спотыкается на
Result := ...

Т.е. что-то не так с Result


При этом если эту DLL вызвать из проекта на Delphi же все работает норм
11 июл 19, 16:33    [21925077]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5215
SQL-Talker,

Pointer(Result) := nil; финализирует переданную строку

я предположил что там мусор, когда задал вопрос 21925071

но ...

сделайте ассемблерный листинг, гнуса нет посмотреть
11 июл 19, 17:08    [21925100]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11196
SQL-Talker
Pointer(Result) := nil;
Убрать. Это потенциальная утечка памяти.

Вызывать так
BSTR bstr= null;
GetLastErrText_CH(true, &bstr);

Далее, адреса &bstr и @Result должны совпадать. Проверьте это
11 июл 19, 17:28    [21925122]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
ziv-2014
Member

Откуда:
Сообщений: 462
SQL-Talker, А тебя не смущает, что у тебя заголовки функций на Delphi и си они разные? В си ты передаешь 2 параметра (один BOOL, другой указатель и ничего не возвращаешь), а в делфи один параметр и один возвращаешь в результате? С чего бы должно работать-то? Стек поганишь само собой!
11 июл 19, 17:30    [21925125]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 419
ziv-2014,

Вот тут _Vasilisk_ пояснял эту особенность: 21924280
Эта схема у меня работает на функциях без пходящих параметров, затык случился с функцией, у которой есть входной параметр
11 июл 19, 18:00    [21925158]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 419
_Vasilisk_,

Pointer(Result) := nil; - убрал

в C++ вывожу адрес:
cout << "\nbstr addr = " << &bstr;
все Ок

в DLL вывожу адрес:
ShowMessage(Format('%x', [Integer(addr(Result))]));
Если DLL вызывать из Delphi-кода, то отображается 16-ричное число
А если из C++ то показывает строго 1 (единицу)
11 июл 19, 18:05    [21925162]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11196
SQL-Talker,

Посмотрел. Для stdcall Result передается как первый параметр. Т.е. импорт должен быть таким
    typedef void (__stdcall *Func)(BSTR*, BOOL);
и вызов
	BSTR bstr = nullptr;
    GetLastErrText_CH(&bstr, true);
11 июл 19, 18:08    [21925166]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 419
_Vasilisk_,

Взлетело!
Вы просто волшебник ))
Спасибо
11 июл 19, 18:18    [21925178]     Ответить | Цитировать Сообщить модератору
 Re: DLL - Написать DLL, в ней функцию, которая возвращает массив записей.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11196
SQL-Talker
Взлетело!
И обратите внимание, в Delphi у вас используется WordBool, а в Си BOOL. Это разные типы. Приведитесь к общему знаменателю
11 июл 19, 18:28    [21925187]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4]      все
Все форумы / Delphi Ответить