Вверх ↑
Этот топик читают: Гость
Ответов: 346
Рейтинг: 28
#1: 2025-02-15 15:45:38 ЛС | профиль | цитата
Странные ошибки ловлю.
https://forum.hiasm.com/getfile/39714
Выбираем сервер с 1 по 6 и ловим ошибку, либо сразу, либо после закрытия формы.
Господа, что думаете по этому поводу?
Есть ли решение?
карма: 2
0
Ответов: 850
Рейтинг: 186
#2: 2025-02-15 18:19:02 ЛС | профиль | цитата
envoy_sky писал(а):
Есть ли решение?

Решение есть всегда. Но иногда, по разным причинам, оно не устраивает.
https://forum.hiasm.com/getfile/39715
карма: 17

0
файлы: 1No_Error.zip [15.3KB] [35]
Ответов: 346
Рейтинг: 28
#3: 2025-02-15 18:26:55 ЛС | профиль | цитата
Gunta писал(а):
Но иногда, по разным причинам, оно не устраивает.

Главное работает.
Почему ошибка выходила?
Что то я так и не смог ответа найти.
карма: 2
0
Ответов: 850
Рейтинг: 186
#4: 2025-02-16 07:34:05 ЛС | профиль | цитата
envoy_sky писал(а):
Почему ошибка выходила?

Не знаю. Наверное, с массивами нельзя работать в dll
карма: 17

0
Ответов: 1088
Рейтинг: 78
#5: 2025-02-16 16:12:27 ЛС | профиль | цитата
Gunta писал(а):
Наверное, с массивами нельзя работать в dll

Дело не в массивах. Ошибка в недрах D-компилятора. На штатном fpc ошибки нет.

nesco будешь мимо проходить, глянь в

hiUseHiDLL;
...
procedure dll_Event(var _Data:TData; Index:word; Param:pointer);
...

dt.sdata := pchar(_data.sdata); // временное решение для отлова ошибки
//dt.sdata := pchar(@_data.sdata[1]); // тута вылет при получении адреса
...

Никогда в темные дебри внутренностей пакета не вникал, так что где, что, кому, когда - понятия не имею

Редактировалось 1 раз(а), последний 2025-02-16 16:57:39
карма: 0

0
Ответов: 346
Рейтинг: 28
#6: 2025-02-16 18:20:10 ЛС | профиль | цитата
Gunta писал(а):
Наверное, с массивами нельзя работать в dll

Обнаружил, если DLL использовать не внутри панели ChildPanel то всё работает нормально.
карма: 2
0
Ответов: 4638
Рейтинг: 755
#7: 2025-02-16 18:25:15 ЛС | профиль | цитата
Тип String в Delphi является предметом автоматического освобождения выделенной памяти при выходе переменной из области видимости.
Реализуется это с помощью счетчика ссылок.
Присвоили переменной, передали параметром в функцию - счетчик увеличился.
Присвоили переменной другое значение или вышли из функции - счетчик уменьшился.
Счетчик стал равен 0 - освобождаем выделенную память.

Это является источником проблем при использовании DLL: приложение и DLL являются независимыми исполняемыми файлами, может даже скомпилированными разными компиляторами. Соответственно, в каждом из них код самостоятельно выделяет память и освобождает. Конкретнее - существует менеджер памяти, который отвечает за это.

Когда мы передаём string из главного модуля в функцию DLL мы выделили память под неё в главном модуле.
Но, поскольку DLL сделана на Delphi и работает со string как описано выше, вполне возможна ситуация, когда код DLL попытается освободить память, выделенную под string, которая пришла ему в функцию в качестве параметра.
Но освобождать он будет с помощью своего менеджера памяти, поскольку ничего не знает о каких-либо других.
А менеджер памяти не имеет в своем списке тот блок памяти, в котором находится данная строка.
Вот в этом месте возникает ошибка.
Аналогично если строка создаётся в DLL и возвращается наверх в результатах вызова своей функции.

Решается это подменой менеджера памяти в DLL на тот, что в основном модуле. Я не знаю, предусмотрено ли такое при создании DLL в HiAsm.

В данном случае доступ к символам строки по индексу _data.sdata[1] приводит к копированию строки. Следовательно, предыдущая строка, вероятно, уничтожается, что и приводит к ошибке.
pchar(_data.sdata) конструирует новую строку в своём менеджере, копируя исходную строку, но не уничтожая её. Возможно, так и обходили проблему общего менеджера памяти - создавали копию строки.

И да, на FPC ошибки нет, возможно, потому что там нет копирования строки при _data.sdata[1] (особенности реализации компиляторов).
Поскольку FPC как бы основной компилятор, на нём протестировали и забыли. А на Delphi вылезло.

Редактировалось 3 раз(а), последний 2025-02-16 18:35:47
карма: 26

2
Голосовали:tom-it, envoy_sky
Ответов: 346
Рейтинг: 28
#8: 2025-02-16 18:41:56 ЛС | профиль | цитата

Значит будет ребятам халява

Редактировалось 4 раз(а), последний 2025-02-16 18:59:24
карма: 2
0
Ответов: 1088
Рейтинг: 78
#9: 2025-02-16 18:51:56 ЛС | профиль | цитата
envoy_sky писал(а):
Скомпилированный код HiAsm в Delphi можно в коммерческих делах использовать?

Неа.

И даже если вы купили delphi, еще есть величина прибыли.
Все эти нюансы расписаны у них в лицензионном договоре. Даже бесплатные варианты не всегда таковыми являются.
Обычно бесплатно для некоммерческого использования, или опенсорс. Реже, если годовой размер прибыли не превышает указанную сумму.

--- Добавлено в 2025-02-16 18:55:27

envoy_sky писал(а):
Вроде как TURBO DELPHI free?

Ага, free. Только надо зарегистрироваться и ключик на почту получить, а так как этот продукт уже не поддерживается, то как доказать что ключик вы гордо получили легальным путем.

envoy_sky писал(а):
Значит будет ребятам халява

Вообще-то Netspirit является автором замечательной адаптации пакета виндовс клац, под FPC
Даже если всеми конечностями держитесь за штатный пакет виндовс, так там с коробки fpc идет. А неработающих под ним элементов не так уж и много.
Мне до сих пор не понятно почему все рогами уперлись в древний D4

Редактировалось 2 раз(а), последний 2025-02-16 19:14:58
карма: 0

0
Ответов: 346
Рейтинг: 28
#10: 2025-02-17 11:28:56 ЛС | профиль | цитата
tom-it писал(а):
древний D4

Да я и сам не молодой
Давным-давно получал этот ключ и дистрибутивы есть но компилятор не смог прикрепить к HiAsm. Лежит на диске всё, да вот беда, нет CD-ROM-а у меня
Как вспомню эти балванки, что бы не царапались, покупали специальные кейсы.
Были точки на рынках где можно было записать музыку на диск в машину. Потом пошли флешки, удобная вещь конечно но лазить под стол что бы подключить флешку то ещё приключение. Сейчас эпоха интернет облаков и веб хранилищ.
карма: 2
0
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)