Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Передача Application.Handle из exe Delphi 2007 (не


Автор: ZBugz 15.1.2011, 11:30
Привет. 
1. Присваиваем Application.Handle в DLL переданного значения Application.Handle exe'шника (dll - delphi 2010 unicode, exe - delphi 2007 Ansi) 2. При открытии формы в DLL возникает AV, при этом форма открываеться и типа все работает, но окно AV опять появляеться
3. Без присваивания Application.Handle ошибок нет.

Предлагать переписать ече на delphi 2010 (при этом ошибки не возникает) не предлагать плиз ;) 


Автор: Akella 15.1.2011, 11:52
сам-то понял, что написал?

Автор: ZBugz 15.1.2011, 13:37
smile Ага smile 
Короче смысл в том что есть dll (ansi) компельнутая на 2007 и есть программа на 2010 (unicode), вызываем функцию в dll в качестве параметра Application.Handle от exe, в функции присваиваем переданный Application.Handle от exe, дальше эта функция показывает модальную форму на экране, но при появлении формы получаем AV ли Упривелегет инструктион 

Автор: Akella 15.1.2011, 14:35
Цитата(ZBugz @  15.1.2011,  13:37 Найти цитируемый пост)
smile Ага smile 

ну сам и отвечай на свой ребус  smile

Добавлено через 2 минуты и 30 секунд
не знаю, может угадаю.... ты в курсе, что должно быть в качестве первого модуля в USES в dpr???

ну а так... жди телепузовпатов

Автор: ZBugz 15.1.2011, 15:22
А если так ? Там где /!!! и происходит ошибка

Автор: Akella 15.1.2011, 19:06
Скорее ошибка происходит в DLL

Автор: ZBugz 15.1.2011, 20:00
Я, если чесно, так же думаю. Но сотрудник, который пишет, думает что delphi виноват. Используеться репорт билдер. Когда показываеться форма, для формирования отчета, появляеться AV или EПривелегиес. 
Я вообще думаю что это проблема с правами, хотя почему тогда это нормально работает с exe, если его компельнуть в 2007 ?!...

Автор: Akella 15.1.2011, 20:44
В каких случая чаще всего происходит AV? Если программа пытается получить доступ к тому объекту, который ещё не создан, так? 

А вообще, что означает строка и для чего она?
Код
Application.Handle:=AppHandle;


Автор: ZBugz 16.1.2011, 09:44
Цитата

В каких случая чаще всего происходит AV? Если программа пытается получить доступ к тому объекту, который ещё не создан, так? 

Как только натыкаеться на 
Код
Application.Handle:=AppHandle;

Если ее не передавать, все замечательно запускаеться, но понятно дело кое что не работает.
Цитата

А вообще, что означает строка и для чего она?

Application.Handle exe передаеться в dll
А для чего, это я в понедельник только скажу.

Автор: Akella 16.1.2011, 12:53
Цитата(ZBugz @  16.1.2011,  09:44 Найти цитируемый пост)
Application.Handle exe передаеться в dll

дело в том, что Application.Handle в приложении и в библиотеке один и тот же может быть, в библиотеке нужно вычислять дискриптор по другому

Добавлено через 9 минут и 41 секунду
Цитата(ZBugz @  15.1.2011,  15:22 Найти цитируемый пост)
Присоединённый файл  DtReport.pas 0,68 Kb

этот модуль из программы или из библиотеки?

Автор: ZBugz 16.1.2011, 13:15
Цитата

дело в том, что Application.Handle в приложении и в библиотеке один и тот же может быть, в библиотеке нужно вычислять дискриптор по другому

Ну если это так, значит не совместимость в версиях delphi ?
Цитата

этот модуль из программы или из библиотеки?

Из exe 

Автор: podkashey 28.1.2014, 02:47
Цитата(ZBugz @ 16.1.2011,  13:15)
Цитата

дело в том, что Application.Handle в приложении и в библиотеке один и тот же может быть, в библиотеке нужно вычислять дискриптор по другому

Ну если это так, значит не совместимость в версиях delphi ?
Цитата

этот модуль из программы или из библиотеки?

Из exe

Что получилось в итоге? Избавиться от АВ удалось? А то такая же проблема примерно в том же месте. Точнее, сама строка отрабатывает нормально, а когда ДЛЛ начинает формы создавать идет АВ. Хотя думаю, что это все равно связано с хэндлом.

Автор: Poseidon 29.1.2014, 20:29
Цитата(Akella @  15.1.2011,  14:35 Найти цитируемый пост)
ты в курсе, что должно быть в качестве первого модуля в USES в dpr
Так это же для стрингов, а Handle - это HWnd или попросту Integer. Для передачи в параметре Integer нет чего-то, что должно быть в качестве первого модуля в uses.

ZBugz, можно глянуть код dll, в котором вызывается модальная форма и код exe, который вызывает код dll?

Автор: Alexeis 30.1.2014, 10:57
  Связана проблема, что хэндл главного окна в старших версиях переместился. Я уже не помню точно откуда куда, но вероятно переместился из Application в окно первой формы созданной через CreateForm .
  Если написать псевдокодом, то примерно так нужно, объединять

Код

DllApplication.Handle  := ExeApplication.MainFormHandle;


Подразумевается, что Application.MainFormHandle из экзешника передаем в Dll, а DllApplication.Handle это просто Application.Handle в Dll . По крайней мере в документации написано именно так делать. Но тут важно не забыть, перед выгрузкой Dll вернуть старый хэндл, а то Dll благополучно начнет не своевременно уничтожать главное окно программы.

Автор: ZBugz 31.1.2014, 06:14
Что получилось не знаю, я не для себя спрашивал. Я уже не работаю в той конторе.
DLL был чей то, исходников у программиста не было, знал только на чем он написан и все.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)