powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
12 сообщений из 87, страница 4 из 4
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836464
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,
если заменить
Код: plaintext
1.
BSTR bstr;


на
Код: plaintext
1.
BSTR bstr=SysAllocString(L"new string");



что будет?
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836465
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,
Тогда так
Код: plaintext
1.
typedef BSTR * (__stdcall *Func)(BOOL);


Или в делфи
Код: pascal
1.
function GetLastErrText_CH(Check: WordBool): WideString; safecall;


Указатель на строку будет в eax, так что смотри сами.
Лучше передавать данные через параметры, а не как результат функции - так надежнее будет.
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836466
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)SQL-Talker,
если заменить
Код: plaintext
1.
BSTR bstr;


на
Код: plaintext
1.
BSTR bstr=SysAllocString(L"new string");



что будет?
Тоже самое - падает на вызове функции из DLL
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836469
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обернул код в Delphi в try .. except - получается что при вызове этой DLL из C++ там (в dll) вываливается Access Violation

Код: 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.
26.
27.
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 же все работает норм
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836489
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,

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

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

но ...

сделайте ассемблерный листинг, гнуса нет посмотреть
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836500
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker
Код: pascal
1.
Pointer(Result) := nil;

Убрать. Это потенциальная утечка памяти.

Вызывать так
Код: plaintext
1.
2.
BSTR bstr= null;
GetLastErrText_CH(true, &bstr);


Далее, адреса &bstr и @Result должны совпадать. Проверьте это
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836501
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker, А тебя не смущает, что у тебя заголовки функций на Delphi и си они разные? В си ты передаешь 2 параметра (один BOOL, другой указатель и ничего не возвращаешь), а в делфи один параметр и один возвращаешь в результате? С чего бы должно работать-то? Стек поганишь само собой!
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836515
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

Вот тут _Vasilisk_ пояснял эту особенность: 21924280
Эта схема у меня работает на функциях без пходящих параметров, затык случился с функцией, у которой есть входной параметр
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836518
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

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

в C++ вывожу адрес:
Код: plaintext
1.
cout << "\nbstr addr = " << &bstr;

все Ок

в DLL вывожу адрес:
Код: pascal
1.
ShowMessage(Format('%x', [Integer(addr(Result))]));

Если DLL вызывать из Delphi-кода, то отображается 16-ричное число
А если из C++ то показывает строго 1 (единицу)
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836522
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,

Посмотрел. Для stdcall Result передается как первый параметр. Т.е. импорт должен быть таким
Код: plaintext
1.
    typedef void (__stdcall *Func)(BSTR*, BOOL);

и вызов
Код: plaintext
1.
2.
	BSTR bstr = nullptr;
    GetLastErrText_CH(&bstr, true);
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836532
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Взлетело!
Вы просто волшебник ))
Спасибо
...
Рейтинг: 0 / 0
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
    #39836540
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerВзлетело!И обратите внимание, в Delphi у вас используется WordBool, а в Си BOOL. Это разные типы. Приведитесь к общему знаменателю
...
Рейтинг: 0 / 0
12 сообщений из 87, страница 4 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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