![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Повторная загрузка изображения на форму, которая в DLL
>|< © (2012-07-02 17:37:00)Здравствуйте, уважаемые мастера!
Есть форма, которая находится в DLL.
На форме находится компонент TImage.
DLL экспортирует функцию, которая для своей работы создает экземпляр формы и загружает в компонент TImage изображение.
При повторном вызове метода Image.LoadFromFile вылетает Access Violation и приложение, которое использует данную DLL падает.
Подскажите, как можно решить данную проблему.
Модуль ShareMem в секции uses подключен.
Заранее благодарен.
icWasya (2012-07-04 10:07:00) [1]Anatoly Podgoretsky © (03.07.12 14:19) [32]
>>> На будущее - WideString можно оставить - это стандартный
>>> системный тип.
>Дело не в стандартности, а в том что это не ссылочный тип, обычный PChar, только для юникода
Не только. В Windows есть специальное API для работы с такими строками. И поскольку создание/уничтожение делается средствами Windows, то такие строки можно передавать между модулями, и, в том числе, создавать в одном месте, а уничтожать в другом.
AV (2012-07-03 14:37:00) [2]
> Я через это проходил. Но формы делал в bpl.
Тут мне тоже самое тогда говорили, но меня не послушали.
И потом так и стали делать, уже без меня, насколько мне известно. :)
Про dll тогда усвоил одно -
1. только простые типы.
2. только закулисная работа
Остальное можно, но муторно. Гораздо проще и надежнее перекомпилировать другую версию с другими модулями.
Anatoly Podgoretsky (2012-07-03 14:19:00) [3]
> На будущее: чем это можно заменить?
Статическими массивами
Anatoly Podgoretsky (2012-07-03 14:19:00) [4]
> На будущее - WideString можно оставить - это стандартный
> системный тип.
Дело не в стандартности, а в том что это не ссылочный тип, обычный PChar, только для юникода
>|< (2012-07-03 14:14:00) [5]
>
> А вот это
> TSingleArray = array of single;
> TIntegerArray = array of integer;
> это уже Борландовские примочки, и в других языках работать
> не будут.
На будущее: чем это можно заменить?
icWasya (2012-07-03 14:11:00) [6]На будущее - WideString можно оставить - это стандартный системный тип.
А вот это
TSingleArray = array of single;
TIntegerArray = array of integer;
это уже Борландовские примочки, и в других языках работать не будут.
>|< (2012-07-03 14:05:00) [7]Все разрешилось как нельзя лучше.))
Уже никакой DLL не нужно.
Я передал исходники Delphi-проекта и их переписали под .Net и внедрили в свое приложение.
Всем спасибо за участие!
Особенно Leonid Troyanovsky © (02.07.12 23:58) [16] за полезную доку!
И Анатолию Подгорецкому, который увидел суть проблемы невооруженным взлядом и не указал прямо на причину, а заставил найти самому.
Поступил как настоящий дзен-буддист: если у тебя просят рыбу - дай человеку удочку, пусть научится и словит)))
>|< (2012-07-03 11:54:00) [8]
> Хочу узнать у автора топика, а никнейм у Вас это попа?
кому чего не хватает, тот то и видет)))
brother (2012-07-03 11:53:00) [9]Хочу узнать у автора топика, а никнейм у Вас это попа?
>|< (2012-07-03 11:48:00) [10]
> полгода дописывал мега-прогу на dll.. что ни форточка, то
> dll
> истинной независимости при мне добиться не удалось(потом
> ушел), а гемора - сколько хочешь было..
> Вроде все работает - положили новый компонент на формочку
> - опять побочный косяк. (компанент к какому нибудь глобальному
> объекту обращается, которого еще не передавали. Находим
> в дебаге какого и добавляем передачу и его.. )
> В конце простая форма, без всего, уже ловит over 9000 передач
> всякой фигни..
> Проще(в over 9000 раз) все в одном exe делать.
Я через это проходил. Но формы делал в bpl.
Получилось очень удобно. Если в приложении 100 форм и нужно добавить 101 форму, то достаточно создать bpl-ку с необходимой дочерней формой, подвязать ее через базу в дерево форм, и вуаля - загрузка, обновления, раздача прав доступов - на нее распространяется все, если наследовать ее от правильного предка.
>|< (2012-07-03 11:41:00) [11]
> >|< (02.07.12 19:42) [9]
>
> Нашел в чем причина.
> Модуль ShareMem нужно подключать не только в library но
> и в приложении, которое использует эту Dll.
>
> Но возникла другая проблема:
> При закрытии приложения появляется такая ошибка:
> ---------------------------
> Debugger Exception Notification
> ---------------------------
> Project Project1.exe raised exception class EInvalidPointer
> with message 'Invalid pointer operation'. Process stopped.
> Use Step or Run to continue.
> ---------------------------
> OK Help
> ---------------------------
с этим тоже разобрался, когда указал в правильном месте ShareMem:-)
>|< (2012-07-03 11:40:00) [12]
> Не надо писать ДЛЛ если не в ладах с ними, будет очень больно.
Я и не писал до этого, пока не возникла такая необходимость.
Почему бы сейчас не разобраться с этим?
Зачем всю жизнь страдать и приносить страдания другим своими кривыми DLL-ками?))) Намного лучше будет научиться писать хорошие DLL-ки.
Надеюсь, Мастера мне в этом помогут.)) Ну хотя бы тонкими намеками))))
Тем более, что заказчику понравилась моя программа распознавания текста, построенная на базе нейронной сети, которая распознает не хуже FineReader)))
От того и форма оказалась в DLL-ке.
Думал, как проще переделать приложение в DLL-ку, но наткнулся на такие грабли...
Итог такой: ShareMem выбрасываем.
Соответственно из DLL выбрасываем Forms, String, WideString.
Соответственно экспорт будет сводиться к такой функции:
type
TSingleArray = array of single;
TIntegerArray = array of integer;
function RecognizeImage(Afilename: PChar;
out trust:TSingleArray; out char_codes:TIntegerArray): HResult;stddecl;
Теперь такой вопрос: сможет ли java-программист достать из массивов trust и char_codes значения этих массивов? или нужно для него выбрать другой тим исходящих переменных?
AV (2012-07-03 09:59:00) [13]полгода дописывал мега-прогу на dll.. что ни форточка, то dll
истинной независимости при мне добиться не удалось(потом ушел), а гемора - сколько хочешь было..
Вроде все работает - положили новый компонент на формочку - опять побочный косяк. (компанент к какому нибудь глобальному объекту обращается, которого еще не передавали. Находим в дебаге какого и добавляем передачу и его.. )
В конце простая форма, без всего, уже ловит over 9000 передач всякой фигни..
Проще(в over 9000 раз) все в одном exe делать.
dll для другого языка - не знаю..
Я бы если только не визуальную работу вынес. А казать - пусть та апликуха сама кажет.
AV (2012-07-03 09:42:00) [14]http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=512
начать отсюда
и все related ссылки
а правильный ответ -
> Не надо писать ДЛЛ если не в ладах с ними, будет очень больно.
:)
Anatoly Podgoretsky (2012-07-03 09:37:00) [15]Не надо писать ДЛЛ если не в ладах с ними, будет очень больно.
AV (2012-07-03 09:34:00) [16]и да, если dll пишется для другого языка - только pchar допустим
AV (2012-07-03 09:32:00) [17]а где передача глобальных переменных forms
application, Screen и что там еще
Германн (2012-07-03 01:28:00) [18]
> Ega23 © (02.07.12 23:47) [15]
>
>
> > в этом как раз вопросов нет. заказчик загадал сделать
> в
> > виде dll, чтобы использовать из Java.
>
>
> И ты думаешь, что в Java есть свой ShareMem?
Правильнее было бы спросить думает ли автор, что в Java есть дельфийскийShareMem? И не только в Java, но и во всех языках, кроме самой Дельфи.
KilkennyCat (2012-07-03 00:04:00) [19]
> И ты думаешь, что в Java есть свой ShareMem?
вот тож об этом подумал...
Leonid Troyanovsky (2012-07-02 23:58:00) [20]
> >|< (02.07.12 20:12) [11]
> Или хотя бы ссыль бросьте, где можно почитать, как правильно
> работать с DLL
http://msdn.microsoft.com/en-us/windows/hardware/gg487379.aspx
--
Regards, LVT.