Здравствуйте, Strannic, Вы писали:
D>>Странненько... Проверь попадает ли в WndProc метод.
S>Да попадает.
D>>Кажется я таки понял в чем твоя проблема. Timer — это те же Windows сообщения, соответственно их нужно обрабатывать, и причем в том же потоке где Timer был создан. Так как предложенный мною поток имеет реализацию обработки сообщений — то тебе абсолютно ничего не надо дописывать. Но одно но — создавать все Модули и стартовать плагины нужно именно в Execute. Конструктор Create потока для этих целей не подходит.
S>Т.е. мне необходимо иметь клас плагина, коий нужно экспортировать из DLL, причем незнаю как, и который создавать на Execute потока, а уже реализацию создания этого класса можно(нужно) делать в самой DLL плагина. Верно я понял?
Я бы тебе советовал сделать плагины COM in-proс серверами. Правда это нужно долго обьяснять

Можна также сделать конструкцию типа:
PluginHandle : Integer;
...
PluginHandle := {MyDll}CreatePlugin;
...
{MyDll}StartPlugin (PluginHandle)
..
{MyDll}StopPlugin (PluginHandle)
S>Или может лучше в этом случае плагины писать как потоки, но каждый плагин это один поток. Т.е. реализацию DLL делать как поток? А по событию останова сервиса вызывать функцию DLL, которая будет глушить этот поток.
Думаю не стоит писать полагины потоками, но тоже вариант, иногда это необходимо
S>Еще. А нужнен ли TDllThread.MyMessage2, ведь как только Execute отработает автоматом будет вызван TDllThread.DoTerminate, может более коректно на нем производить остановку и выгрузку DLL, т.е. вместо
S>S>procedure TDllThread.MyMessage2(var Message: TMessage);
S>begin
S> if HandleDLL <> 0 then StopPluggin;
S> Terminate;
S> FreeLibrary(HandleDLL);
S>end;
S>procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
S>begin
S> if DllThread <> nil then
S> SendMessage (DllThread.WndHandle, MY_MESSAGE2, 0, 0);
S> Stopped := True;
S>end;
S>
S>сделать просто
S>S>procedure TDllThread.DoTerminate;
S>begin
S> if HandleDLL <> 0 then StopPluggin;
S> FreeLibrary(HandleDLL);
S>end;
S>
S>что скажешь?
DoTerminate вызывается в главном потоке приложения — это невсегда корректно, да и может подвесить всю программу если StopPlugin зависнет.
Первый вариант более предпочтительней.
D>>Думаю что все таки один сервис лучше
Не будеш же ты из-за каждого плагина регистрить новый сервис
S>Поэтому и хотел смотреть в сторону плагинов к сервису. А что касаеться производительности там, загрузки проца и прочее, я понимаю, что щас это не критично, но все же? Так — что называеться для в общеобразовательных целях?
Советую тебе сделать тестовую программу с двумя кнопками Start (like ServiceStart) и Stop (like ServiceStop).
На ней ты сможеш протестить как все работает в дебаге (это проще чем дебажить сервис).
А потом код перенеси на сервис. Если не будет работать можна проанализировать что у тебя с Permission и другой функциональностью, которая некорректно работает в сервисе.