Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Поддержка тоталовских плагинов в своих программах 
Author Message
VadiMGP



PostPosted: Sat Sep 01, 2007 20:46    Post subject: Reply with quote

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 будет вызван дважды в одном процессе.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group