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
Dec



PostPosted: Sat Sep 01, 2007 18:09    Post subject: Reply with quote

VadiMGP wrote:
я неграмотный программист
2 VadiMGP и остальным:
Извиняюсь, если мои фразы Вас как-либо оскорбили, я ни кого не хотел обижать и ни кого не хотел обвинять в безграмотности.

VadiMGP wrote:
Большинство моих знакомых программистов, которые пишут dll, независимо от их уровня грамотности, заглядывают в MSDN ... DllMain с параметром DLL_PROCESS_ATTACH вызывается только один раз для каждого процесса, а значит тут-то, как правило, и делают инициализацию всех данных
В этом же MSDN паписано:
Quote:
The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions)… Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary) during process termination… Do not call the registry functions… do not call malloc… Calling imported functions other than those located in Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions in their DLLs call LoadLibrary to load other system components. Conversely, calling those functions during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized…Because DLL notifications are serialized, entry-point functions should not attempt to communicate with other threads or processes. Deadlocks may occur as a result.
Я уверен, что Ghisler, как и Вы, тоже знает, что
Quote:
DllMain с параметром DLL_PROCESS_ATTACH вызывается только один раз для каждого процесса
но, тем не менее, добавляет в интерфейс процедуру ContentPluginUnloading. Он объясняет это словами
Quote:
This function was added by request from a user who needs to unload GDI+. It seems that GDI+ has a bug which makes it crash when unloading it in the DLL unload function, therefore a separate unload function is needed.
Т.е. не всегда возможна полная корректная инициализации и финализации в DllMain. Для этого есть ContentSetDefaultParams и ContentPluginUnloading. Повторюсь, что мы не знаем, какой код помещает разработчик в процедуры инициализации и финализации, которые, по его мнению, должны вызываться только один раз. И мы не знаем, к чему приведет их повторный вызов.

VadiMGP wrote:
Я бы в данном случае не стал париться
Я все же считаю, что попариться все стоит, что бы в конечном итоге получить рабочий при любых условиях продукт.

VadiMGP wrote:
Но эти дядьки не знают, что может прийти грамотный программист и скопировать dll в другую директорию, создав, тем самым, ситуацию, когда будет две попытки загрузить один и тот же dll из разных мест. Хотя ему, конечно, известно, что такое Dll Hell и, стопроцентно, он знает, что при этом DllMain с DLL_PROCESS_ATTACH будет вызван повторно для того же dll в том же процессе
Не допонял. Почему для того же dll? Ведь после копирования это физически будет другая dll.

Знаю, что решение с копирование плагина не самое лучшее, но оно рабочее. И именно для того, что бы найти более лучшее решение я и поднял этот вопрос.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group