![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Domoffou |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Здравствуйте.
Пишу программу прямо в dll, ей ничего не нужно будет, кроме как просто loadlibrary из другого приложения. В ДЛЛ необходимо использовать таймеры и потоки (как в обычном приложении), т.к. в ней будет стоять хук и по определенным фразам необходимо делать скриншот и выполнять другие определенные действия, поэтому если все действия будут не в потоке, то полагаю клава подвиснет. Пытался создать в DLL отдельный поток, как в программе, но он вылетает с ошибкой по методу execute Приведу пример:
Т.е. если происходит запуск потока, то библиотеке это не нравится. Соответственно вопрос, как организовать потоки прямо в dll? Это сообщение отредактировал(а) Domoffou - 22.6.2008, 22:30 |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
как минимум MessageBox из потока вызывать нельзя -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Cashey, почему?
Domoffou, случайно не так делаешь?
|
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
потому что, обращение к ресурсу из потока может осуществлятся только через метод Synchronize -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
к какому ресурсу??? по идее никакой ошибки Windows.MessageBox вызывать не должен в случае вызова из потока, НО:
Это сообщение отредактировал(а) MetalFan - 23.6.2008, 12:19 -------------------- There are always someone smarter than you... |
||||
|
|||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
да? ну вызыве мессэйдж из потока, а я посмотрю -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Cashey, Synchronize предназначен для безопасного вызова метода, обычно работающего с VCL, или там, где требуется сложная синхронизация. В данном случае VCL вообще не используется.
MessageBox <> TApplication.MessageBox; Вызывать можно без синхронизации.
Это сообщение отредактировал(а) Rrader - 22.7.2008, 14:42 |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
да легко! в чем проблема то? вызывается все прекрасно! (подчеркну - именно Windows.MessageBox, а не Dialogs.MessageDlg)
-------------------- There are always someone smarter than you... |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
все, извеняюсь, попутал с ShowMessage -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| Domoffou |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Все в порядке, Господа
проблему удалось решить несколько иначе. Ошибка возникала потому, что при инициализации DLL запрещены некоторые действия (в т.ч. создание потоков), поэтому создавал потоки я позже, после загрузки DLL. А MessageBox вызывается нормально |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
А откуда информация что "при инициализации DLL запрещено создание потоков" ? IMHO, зависит от того как создавать поток (например, не стоит использовать SysUtils). |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 7 Всего: 158 |
Best Practices for Creating DLLs (doc) |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
dumb,
Хм... Как-то я ухитрилась пропустить этот момент раньше. Спасибо. Очень жаль что не расписали почему рискованно. P.S. У меня пара проектов довольно давно и довольно успешно работает . В них используется BeginThread в DllMain. Причем один из них "работает из App_InitDll" (если правильно запомнила имя). Я понимаю, что BeginThread вызывает CreateThread, но может в этом причина их "не падений" ? |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 16 Всего: 89 |
Создание потоков в DllMain не запрещено. Оно просто не рекомендуется, т.к. может привести к взаимной блокировке. Подробно что, как и почему можно посмотреть, например, здесь: Best Practices for Creating DLLs (http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx - справа пункт Download). -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Domoffou |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Блин, теперь другая проблема но из той же темы :(
Делаю так: 1. открываю DLL 2. запускаю форму из нее 3. при FormCreate делаю:
в свою очередь:
что самое интересное, поток создается только в тот момент, когда я закрываю форму, созданную из DLL. Подскажите, пожалуйста, что не так. Это сообщение отредактировал(а) Domoffou - 6.7.2008, 19:06 |
||||
|
|||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |