VadiMGP
|
Posted: Sat Sep 01, 2007 20:46 Post subject: |
|
|
Dec wrote: | Не допонял. Почему для того же dll? Ведь после копирования это физически будет другая dll. | Это будет другой файл, да. Но я имел в виду, это тот же самый код дважды смаппированный в процесс. А код этого никак не ожидает, особенно в части инициализации данных, специфических для процесса (и даже для каждого потока этого процесса). А что если в dll есть общая память и он хранит в ней список процессов, в которые он загружен? А что если он содает атом используя идентификатор процесса, как уникальное знаечение?
Dec wrote: | В этом же MSDN паписано: | Это верно. Только это к обсуждаемому вопросу не относится. Это совершенно другое. В DllMain не надо делать ничего критического и разумеется мало-мальски опытный программист не будет в DllMain вставлять ни коммуникацию, ни межпоточную синхронизацию ни загрузку других dll. К сожалению, те дятлы, которые писали GDI+ этого не выучили, и на FreeLibrary тоже вызывают FreeLibrary. Они не предполагали, что GDI+ будут загружать динамически. Поэтому Гислер и был вынужден дать возможность обойти этот баг для плагинов, и дать шанс выгрузить GDI+ до того, как будет вызвана FreeLibrary для плагина.
Dec wrote: | Повторюсь, что мы не знаем, какой код помещает разработчик в процедуры инициализации и финализации, которые, по его мнению, должны вызываться только один раз. И мы не знаем, к чему приведет их повторный вызов. | Совершенно верно. Только мы не знаем, также, какой код инициализации разработчик поместил в DllMain, а в твоем варианте это будет повторный вызов DllMain. Та же проблема, но с другой стороны.
И поверь, если бы я считал, что твой метод действительно даст решение "при любых условиях" - то только восторгнулся бы этим. Но в том тот и дело, что я считаю, что ты собираешься взвалить на себя здоровый кусок работы, но все равно останутся ситуации, которые ты обслужить не сможешь. А в некоторых ситуациях, наборот - сделаешь хуже.
А вдруг плагин хранит в totalcmd.ini путь к какому-то своему файлу? Что-то вроде %COMMANDER_PATH%\Plugin\ppp\file.dat? Между прочим, Гислер как раз рекомендует хранить плагиновые данные в totalcmd.ini. Этой рекомендации, по-моему никто не следует, а все создают свои ini айлы. А вдруг не все?
Давай резюмировать. Ты хочешь избежать повторного вызова ContentSetDefaultParams. На мой взгляд - напрасно. В документации к TC API сказано, что плагин может быть вызван из разных потоков одного процесса и нормальный программист учтет это. Но мне трудно поверить, что кто-то учтет возможность, что DllMain будет вызван дважды в одном процессе. |
|