View previous topic :: View next topic |
Author |
Message |
Alextp
Joined: 06 Feb 2005 Posts: 4957
|
|
Back to top |
|
|
DrShark
Joined: 21 Oct 2006 Posts: 911 Location: Kyiv, Ukraine
|
(Separately) Posted: Fri Jun 29, 2007 14:20 Post subject: |
|
|
У продуктов SpeedProject всё немецкое Единственное английское, что я нашёл - это интерфейс SpeedCommander, и то опционально. Патриоты А вообще менеджер очень даже хороший. |
|
Back to top |
|
|
Alextp
Joined: 06 Feb 2005 Posts: 4957
|
|
Back to top |
|
|
Dec
Joined: 07 Sep 2006 Posts: 466
|
(Separately) Posted: Thu Aug 30, 2007 14:40 Post subject: |
|
|
Задумал я использовать WDX плагины в одном из своих. Но не знаю, как решить одну проблему. По WDX спецификации после загрузки должна быть вызвана функция ContentSetDefaultParams, а перед выгрузкой ContentPluginUnloading. Поскольку WDX плагин может быть загружен как TC, так и моим плагином одновременно, то эти функции могут быть вызваны дважды. Мы не знаем, какой код помещает разработчик в эти функции, и поскольку у TC и моего плагина одно адресное пространство, то это может привести к повторной инициализации и преждевременной финализации данных, что в конечном счете IMHO может привести к сбоям в работе TC или плагина. Единственное, что я придумал, это копировать перед началом работы с WDX плагином этот плагин и остальное содержимое папки, в которой он лежит, в temp`овую директорию и работать с ним. Как другие решают эту проблему, или это не проблема вовсе? |
|
Back to top |
|
|
B4rr4cuda
Joined: 03 Jun 2007 Posts: 376 Location: Россия, Москва
|
(Separately) Posted: Thu Aug 30, 2007 15:55 Post subject: |
|
|
Рекомендую обрабатывать DLLEntryPoint для идентификации загрузчика:
Code: | procedure DLLEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: ShowMessage('Attaching to process');
DLL_PROCESS_DETACH: ShowMessage('Detaching from process');
DLL_THREAD_ATTACH: MessageBeep(0);
DLL_THREAD_DETACH: MessageBeep(0);
end;
end;
begin
{ First, assign the procedure to the DLLProc variable }
DllProc := @DLLEntryPoint;
{ Now invoke the procedure to reflect that the DLL is attaching to the
process }
DLLEntryPoint(DLL_PROCESS_ATTACH);
end. |
Добавленно:
Сорри, задумался и недопонял суть вопроса. То что выше для самописного плага с поддержкой такой возможности.
ВDLL_PROCESS_ATTACH идентифицируем подключение тоталом,
в DLL_THREAD_ATTACH подключение плагином.
А для твоей ситуации - прожка лоадер+pipes. |
|
Back to top |
|
|
B4rr4cuda
Joined: 03 Jun 2007 Posts: 376 Location: Россия, Москва
|
(Separately) Posted: Thu Aug 30, 2007 16:08 Post subject: |
|
|
Quote: | Как другие решают эту проблему, или это не проблема вовсе? |
Может быть проблемой. TotalConsole тоже сначала писалась как wdх, я много мороки получил с FindFirstThread когда тотал подключал плаг отдельным потоком. Ты проведи тесты на каком нить плагине, тогда и узнаешь точно. |
|
Back to top |
|
|
Dec
Joined: 07 Sep 2006 Posts: 466
|
(Separately) Posted: Thu Aug 30, 2007 17:08 Post subject: |
|
|
Quote: | в DLL_THREAD_ATTACH подключение плагином. |
Reason = DLL_THREAD_ATTACH обозначает только то, что в процессе создан еще один поток. Мой плагин может загружать и вызывать функции из WDX плагина и в основном потоке, так что это ничего не меняет.
Quote: | А для твоей ситуации - прожка лоадер+pipes |
Самому грузить плагин, минуя LoadLibrary? Ну спасибо, я лучше буду через temp директорию работать.
Quote: | Ты проведи тесты на каком нить плагине, тогда и узнаешь точно. |
Сколько плагинов, столько и проблем. То, что в одном плагине сработает, то в другом может привести к access violation. Меня интересует общее универсальное решение. |
|
Back to top |
|
|
B4rr4cuda
Joined: 03 Jun 2007 Posts: 376 Location: Россия, Москва
|
(Separately) Posted: Thu Aug 30, 2007 20:10 Post subject: |
|
|
Quote: | Reason = DLL_THREAD_ATTACH обозначает только то, что в процессе создан еще один поток. |
Это означает только то - что библиотеку вызвали потоком.
Quote: | Мой плагин может загружать и вызывать функции из WDX плагина и в основном потоке, так что это ничего не меняет. |
И списки айди этих потоков, процессов можно классифицировать, разделить и понять кто вызывал данный плагин.
Но тебе это не поможет, у тебя другая засада. Это решение для поддержки твоего вопроса из плагина.
Quote: | Самому грузить плагин, минуя LoadLibrary? Ну спасибо, я лучше буду через temp директорию работать |
Насчёт лоадера, ты меня недопонял: пишешь небольшую прожку-прослойку между твоим плагином и вызываемым плагином.
Коннектишься с этой прожкой через трубы (или через что угодно, хоть сокеты используй) и управляешь через неё вызванным плагином(передаёшь ей параметры вызовов, она передаёт плагу и обратно).
Адрессные пространства у тотала и твоей прожки разные - соответственно не будет описанных тобой проблем. А access violation этого плагин-лоадера не затронут тотал... |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Sep 01, 2007 01:30 Post subject: |
|
|
Стер, все что написал.
Сорри, я ошибся - неправильно понял вопрос. |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Sep 01, 2007 02:00 Post subject: |
|
|
Dec wrote: | Как другие решают эту проблему, или это не проблема вовсе? |
Если я правильно понял, ты хочешь работать с WDX плагинами, так же, как SuperWdx, InfoPacker, WDXGuide и т.д.
В практическом плане никто из них, пока, ни на какую проблему (связанную с многократной загрузкой!) не наткнулся.
В теории, может возникнуть плагин, который будет делать с этим проблемы, но это вряд ли.
ЗЫ. B4rr4cuda wrote: | Это означает только то - что библиотеку вызвали потоком. | Нет. Dec прав, DLL_THREAD_ATTACH обозначает, что в процессе создан еще один поток. В MSDN четко написано
Quote: | DLL_THREAD_ATTACH Indicates that the current process is creating a new thread. |
|
|
Back to top |
|
|
B4rr4cuda
Joined: 03 Jun 2007 Posts: 376 Location: Россия, Москва
|
(Separately) Posted: Sat Sep 01, 2007 03:23 Post subject: |
|
|
Quote: | DLL_THREAD_ATTACH обозначает, что в процессе создан еще один поток. В MSDN четко написано |
Т.е. подключенная библа очень красиво отслеживает создание\освобождение потоков, процесса подключившего её?
Интересно, надо подумать как это можно использовать.... |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Sep 01, 2007 04:02 Post subject: |
|
|
B4rr4cuda wrote: | Интересно, надо подумать как это можно использовать.... | В общем виде ответ очевиден - когда dll использует данные, специфические для потока.
Например, многие объекты MFC не могут передавться из потока в поток. И если dll обменивается такими объектами с вызывающим модулем, то они должны быть созданы свои для каждого потока.
Другой пример - допустим есть сервер, который для обслуживания запросов создает потоки. Часть обработки вынесена в dll, который может быть вызван из любого потока. В этом случае иногда в TLS потока (thread local storage) хранят и сам запрос и все, что нужно для его обслуживания.
В любом случае - экзотика. |
|
Back to top |
|
|
Dec
Joined: 07 Sep 2006 Posts: 466
|
(Separately) Posted: Sat Sep 01, 2007 09:29 Post subject: |
|
|
VadiMGP wrote: | В теории, может возникнуть плагин, который будет делать с этим проблемы |
Грамотный программист, к коим я приписываю себя (возможно ошибочно), обязан предусмотреть такую ситуацию. |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Sep 01, 2007 15:39 Post subject: |
|
|
Quote: | Грамотный программист, к коим я приписываю себя (возможно ошибочно), обязан предусмотреть такую ситуацию. | Да ради бога, я же не против. Я бы в данном случае не стал париться, но это потому, что я неграмотный программист.
Но очень мне хотелось бы знать как ты собираешься предусмотреть и другую ситуацию.
Dec wrote: | Единственное, что я придумал, это копировать перед началом работы с WDX плагином этот плагин и остальное содержимое папки, в которой он лежит, в temp`овую директорию и работать с ним. | Большинство моих знакомых программистов, которые пишут dll, независимо от их уровня грамотности, заглядывают в MSDN, где умные (а может и глупые, бог их разберет) дядьки из MS говорят: Quote: | Even if an application calls LoadLibrary() for a DLL more than once, the DLL entry point, DllMain(), is called only once and only one DLL_PROCESS_ATTACH entry is created. | А это означает, что DllMain с параметром DLL_PROCESS_ATTACH вызывается только один раз для каждого процесса, а значит тут-то, как правило, и делают инициализацию всех данных, специфических для процесса (если таковые есть, конечно) пребывая в уверенности, что это происходит только один раз в процессе. Но эти дядьки не знают, что может прийти грамотный программист и скопировать dll в другую директорию, создав, тем самым, ситуацию, когда будет две попытки загрузить один и тот же dll из разных мест. Хотя ему, конечно, известно, что такое Dll Hell и, стопроцентно, он знает, что при этом DllMain с DLL_PROCESS_ATTACH будет вызван повторно для того же dll в том же процессе.
Я уже и не спрашиваю, что ты будешь копировать, если в директории плагина вдруг окажется NTFS линк на чертову прорву мегабайт. |
|
Back to top |
|
|
Alextp
Joined: 06 Feb 2005 Posts: 4957
|
(Separately) Posted: Sat Sep 01, 2007 16:49 Post subject: |
|
|
Вадимгп, ты гонишь. откуда у плагина возьмется какой-то линк. На какие-то мегабайты?
Не видел таких плагинов, чсно говоря. Фантазии какие-то. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|