![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
Unconnected |
![]()
Сообщение
#41
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Цитата прекрасно удаляет ту самую DLL-ку, которая была в прошлом проекте, Да, действительно. Мою, впрочем, тоже удаляет обычный deletefile, когда я запускаю программу простым даблкликом. Оказался виноват довольно специфичный авторан. Никогда бы на него не подумал, дошло только в ходе экспериментов. Кажется, там мой процесс с какими-то другими привилегиями запускается, что ли... Помог отказ от FreeLibrary (да, каюсь, так не надо писать программы, ну святых тоже не бывает, та же delphi, по словам Ган-блоггера)). Я нагуглил топик, где у кого-то на FreeLibrary вылетало исключение, и он в итоге убрал совсем и помогло, мне тоже помогло) Цитата До тех пор, пока счетчик этот не станет = 0, DLL выгружена не будет. На одном форуме в качестве совета для принудительной выгрузки dll видел совет сделать бесконечный цикл из FreeLibrary, наверное, "пока не сдохнет" ![]() Ещё раз спасибо за советы, всё получилось ![]() Сообщение отредактировано: Unconnected - 17.09.2010 21:28 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
Unconnected |
![]()
Сообщение
#42
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
И ещё незадача.. я тут пробовал на разные приложения хук нацеливать, и заметил, что некоторые (это не антивирусы, на них не пробовал
![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#43
|
Гость ![]() |
"Некоторые" - это какие, например? (желательно - из самых известных, чтоб можно было проверить) Что сообщает Системный Журнал в таком случае, из-за чего ошибка произошла?
|
Unconnected |
![]()
Сообщение
#44
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Например мессенджер QIP, в журнале такое: Ошибка приложения qip.exe, версия 8.0.8.1, модуль kernel32.dll, версия 5.1.2600.2180, адрес 0x0001eb33.
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#45
|
Гость ![]() |
И какой класс окна ты запрещаешь, чтоб "погасить" QIP?
Добавлено через 4 мин. Кстати, вот тут: CBTProc and HCBT_CREATEWND говорится, что подобное поведение может быть признаком не совсем правильно написанной программы: Цитата Well, it may be that the creator of the window didn't presume that the create could fail and it is possible that you are uncovering a bug. В случае с QIP-ом вполне возможный вариант... |
Unconnected |
![]()
Сообщение
#46
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Ну для инфиума, например - TFRMMAN (в полном названии ещё был суффикс .unicode, ну там всё равно pos используется).
Цитата В случае с QIP-ом вполне возможный вариант... Ага, вот и не юзай тут всякие хитроумные функции ![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#47
|
Гость ![]() |
Цитата Ну для инфиума, например - TFRMMAN Ага, щаззз ![]()
А ты говоришь, TFrmMan... Ну, убьешь ты его, и что? ![]() |
Unconnected |
![]()
Сообщение
#48
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
![]() И чего теперь, мне атомную бомбу на всю эту толпу кидать?)) -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#49
|
Гость ![]() |
Цитата А можно название программки, которая этот лог сделала? Я тебе лучше покажу, как DLL-ку изменить, чтоб такое лог получать, ладно? Вот функция хука (в DLL):function CBTProc(Code: integer; myWParam: WPARAM; , а вот так это ловится: // в классе формы - заголовокустанавливаешь хук и запускаешь любое приложение значком быстрого вызова, который лежит на десктопе, чтоб лишние окна не создавались - получаешь список всех классов, созданных при запуске приложения. Цитата И чего теперь А теперь искать, какой из этих классов занимается собственно созданием приложения, и убивать именно его... |
Unconnected |
![]()
Сообщение
#50
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Хм.. попробовал тормозить все классы, стоящие до TfrmMan (и вместе, и по отдельности - они там повторяются, кстати) - окошко квипа так же появлялось, а если тормозить и TfrmMan - то все, багрепорт) Я вот чего думаю, поставил я хук, ведь пока сообщение не пройдет все ловушки, к квипу не придёт? Можно ведь "приостанавливать" процесс запуска, а в это время убивать процесс, хэндл-то есть... и хитроумная процедура тоже)
Добавлено через 15 мин. Да, так получается, в принципе.. Ловлю самый первый класс и завершаю процесс. Правда, тут применяю и первую "хитроумную" процедуру, для получения пути к файлу, т.к. для завершения процесса второй хитроумной нужно знать имя exe. У любителей superqip.exe не сработает, правда.. ![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#51
|
Гость ![]() |
Цитата Хм.. попробовал тормозить все классы, стоящие до TfrmMan (и вместе, и по отдельности - они там повторяются, кстати) - окошко квипа так же появлялось Неправда ![]() if (pos(UpperCase('tapplication'), UpperCase(GetClName(myWParam))) > 0) or Этого достаточно, чтоб убить QIP. Ну, в смысле, то окно выбора аккаунта. Тебе надо было всего навсего добавить в возвращаемую в приложение строку еще и хендл объекта и хендл его предка, и посмотреть, от чего же так зависит появление окна на экране. И кто владелец того окна, на котором заканчивается лог (и выбрасывается окно с сообщением об ошибке). Последовательно проходишь назад, уничтожая всех предков, и вот оно, чудо !!! ![]() Так что не надо никаких бомб, опытный снайпер с хорошей оптикой может принести гораздо больше вреда ![]() |
Unconnected |
![]()
Сообщение
#52
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Кажется, поправку на ветер забыл
![]() В предыдущем посте три смайла образуют равнобедренный тупоугольный треугольник, тонко ![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#53
|
Гость ![]() |
Цитата Можно ведь "приостанавливать" процесс запуска, а в это время убивать процесс, хэндл-то есть... Можешь показать, как именно ты "приостанавливаешь процесс"? Где это происходит? И как именно ты убиваешь процесс? А потом я скажу, чем будет чреват такой подход, ладно? ![]() |
Unconnected |
![]()
Сообщение
#54
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
//uses tlhelp32; Точнее, тут ничего не приостанавливается, просто по создании первого класса будет передан хэндл, по которому сразу опознается, вычислится и уничтожится процесс.. и дальше дело не пойдёт..теоретически) Сообщение отредактировано: Unconnected - 19.09.2010 13:22 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#55
|
Гость ![]() |
Ну не знаю... Ловить HCBT_CREATEWND, и вместо того, чтобы просто вернуть 1 - вызывать стороннюю процедуру, которая будет уничтожать процессы через TerminateProcess (который был, кстати, создан совсем для других целей) - это как-то... Входит как раз в 90%
![]() Кстати, если уж TerminateProcess - то перебор всех процессов совсем не обязательно делать, достаточно: case Code of, это точно так же снесет QIP... Останется только провести мышой над треем (или каким-то образом обновить трей, чтоб иконка убитого приложения ушла оттуда). |
Unconnected |
![]()
Сообщение
#56
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Ловить HCBT_CREATEWND, и вместо того, чтобы просто вернуть 1 Ну по сути result:=1 и терминатор делают одно и то же, только для первого надо для каждого приложения искать нужные классы, а тут раз и всё ![]() Цитата Да, а что насчет работы под Win64? Уверен? Попробовал на своей win7 home 64 - перехват работает хорошо - нужные окна виду не показывают. Но вот PostMessage, кажется, недокидывает до основной программы сообщение, но это уже наверное мой косяк.. или не мой..) Цитата это точно так же снесет QIP... Легким движением руки 20 строк превращаются...))) Ну вроде пока всё работает, спасибо ![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
Snake_B |
![]()
Сообщение
#57
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
это точно так же снесет QIP... Останется только провести мышой над треем (или каким-то образом обновить трей, чтоб иконка убитого приложения ушла оттуда). вот кстати вопросик (да и чтобы темы не плодить)... как можно чужую иконку оттуда убрать... и как её туда вернуть? удалить то по моему легко можно... а вот как обратно её добавить (и зарегистрировать на родную программу)... |
volvo |
![]()
Сообщение
#58
|
Гость ![]() |
Цитата как можно чужую иконку оттуда убрать... и как её туда вернуть? Попробуй посмотреть вот тут: http://rouse.drkb.ru/winapi.php#fwsystrayinfo , у Rouse_ с Исходников есть пример работы с иконками для WinXP. Чтоб иметь возможность восстановить иконку, надо перед удалением запомнить где-то у себя ту иконку (одну или несколько), которые установлены нужным приложением, а потом послать приложению Shell_NotifyIcon + NIM_ADD |
Snake_B |
![]()
Сообщение
#59
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Попробуй посмотреть вот тут: http://rouse.drkb.ru/winapi.php#fwsystrayinfo , у Rouse_ с Исходников есть пример работы с иконками для WinXP. Чтоб иметь возможность восстановить иконку, надо перед удалением запомнить где-то у себя ту иконку (одну или несколько), которые установлены нужным приложением, а потом послать приложению Shell_NotifyIcon + NIM_ADD о.... спасибо... поковыряю... > а потом послать приложению Shell_NotifyIcon + NIM_ADD системному трею послать же? Сообщение отредактировано: Snake_B - 20.09.2010 1:39 |
volvo |
![]()
Сообщение
#60
|
Гость ![]() |
Ну да, трею, разумеется...
|
![]() ![]() |
![]() |
Текстовая версия | 6.08.2025 23:05 |