Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Повторная загрузка изображения на форму, которая в DLL


Страницы:   1 2

>|< ©   (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:-)


&gt;|&lt;   (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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо