Странные ошибки ловлю.
https://forum.hiasm.com/getfile/39714
Выбираем сервер с 1 по 6 и ловим ошибку, либо сразу, либо после закрытия формы.
Господа, что думаете по этому поводу?
Есть ли решение?
Этот топик читают: Гость
Ответов: 346
Рейтинг: 28
|
|||
карма: 2 |
|
Ответов: 850
Рейтинг: 186
|
|||
envoy_sky писал(а): Есть ли решение?Решение есть всегда. Но иногда, по разным причинам, оно не устраивает. https://forum.hiasm.com/getfile/39715 |
|||
карма: 17 |
| ||
файлы: 1 | No_Error.zip [15.3KB] [35] |
Ответов: 346
Рейтинг: 28
|
|||
Gunta писал(а): Но иногда, по разным причинам, оно не устраивает.Главное работает. Почему ошибка выходила? Что то я так и не смог ответа найти. |
|||
карма: 2 |
|
Ответов: 850
Рейтинг: 186
|
|||
envoy_sky писал(а): Почему ошибка выходила?Не знаю. Наверное, с массивами нельзя работать в dll |
|||
карма: 17 |
|
Ответов: 1088
Рейтинг: 78
|
|||
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 |
|
Ответов: 346
Рейтинг: 28
|
|||
Gunta писал(а): Наверное, с массивами нельзя работать в dllОбнаружил, если DLL использовать не внутри панели ChildPanel то всё работает нормально. |
|||
карма: 2 |
|
Ответов: 4638
Рейтинг: 755
|
|||
Тип 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 |
| ||
Голосовали: | tom-it, envoy_sky |
Ответов: 346
Рейтинг: 28
|
|||
![]() Значит будет ребятам халява ![]() Редактировалось 4 раз(а), последний 2025-02-16 18:59:24 |
|||
карма: 2 |
|
Ответов: 1088
Рейтинг: 78
|
|||
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 |
|
Ответов: 346
Рейтинг: 28
|
|||
tom-it писал(а): древний D4Да я и сам не молодой ![]() Давным-давно получал этот ключ и дистрибутивы есть но компилятор не смог прикрепить к HiAsm. Лежит на диске всё, да вот беда, нет CD-ROM-а у меня ![]() Как вспомню эти балванки, что бы не царапались, покупали специальные кейсы. Были точки на рынках где можно было записать музыку на диск в машину. Потом пошли флешки, удобная вещь конечно но лазить под стол что бы подключить флешку то ещё приключение. ![]() |
|||
карма: 2 |
|
10