Здравствуйте, dimchick, Вы писали:
D>структурка маленькая — ~80 байт. просто я не люблю такой подход.
Я тоже. Но в данном случае процесс заверщается почти сразу по завершению ServiceMain.. Моей совести этого достаточно
D>я тут подумал, _endthread тоже некорректно. По прототипу ServiceMain не подходит для создания потока, Значит ее кто-то вызывает и по возвращению из нее может что-то делать.
Логично. Хуже того, этот "кто-то" может быть написан на C и использовать RTL.
D>Почему MS не дала возможность создавать поток нам?
При большом желании можно обойти ситуацию "вручную". Т.е. вначале ServiceMain определять, была ли RTL инициализирована, и, если нет — инициализировать. А в конце очищать, если в начале инициализировали. Сделать логично в виде объекта, который в конструкторе проверяет и инициализирует, а в деструкторе очищает.
Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, SergH, Вы писали:
SH>>Логично. Хуже того, этот "кто-то" может быть написан на C и использовать RTL.
SH>Имелось ввиду, что просто деинициализировать RTL, даже не завершая поток, тоже нехорошо. .
почему? мы деиницализируем свой RTL. он никак не связан с RTL системы.
у меня получалось деинициализировать RTL только если он влинкован в приложение (заюзал ф-ию _thread_data_del + _thread_data).
динамическая библиотека не экспортирует ф-ии для работы с THREAD_DATA
Здравствуйте, dimchick, Вы писали:
D>почему? мы деиницализируем свой RTL. он никак не связан с RTL системы.
Имхо, данные они хранят в TLS. Или не так? Если так, то очищаая ячейку TLS, мы деинициализируем RTL для текущего потока, независимо от того, в dll он или в статически скомпонован.
Но могу ошибаться, про TLS это я так бы сделал, как у них не знаю.
Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, dimchick, Вы писали:
D>>почему? мы деиницализируем свой RTL. он никак не связан с RTL системы.
SH>Имхо, данные они хранят в TLS. Или не так? Если так, то очищаая ячейку TLS, мы деинициализируем RTL для текущего потока, независимо от того, в dll он или в статически скомпонован.
SH>Но могу ошибаться, про TLS это я так бы сделал, как у них не знаю
в tls хранится указатель на структуру
[ccode].
extern DWORD __thread _tlsindex; /* thread local storage index (tls.c) */
/* If no thread data has been allocated for this thread, allocate
* it and save a pointer to it in the thread local storage block.
*/
if ((p = (THREAD_DATA *)_tlsindex) == NULL)
{
p = _thread_data_new();
_tlsindex = (DWORD)p;
}
return p;
}
[/code]
Здравствуйте, SergH, Вы писали:
SH>Имхо, данные они хранят в TLS. Или не так? Если так, то очищаая ячейку TLS, мы деинициализируем RTL для текущего потока, независимо от того, в dll он или в статически скомпонован.
Сорри, понял свою ошибку. У разных RTL будут разные ячейки.
void _thread_data_del(THREAD_DATA *t)
{
_lock(thread_lock,"locking thread data (del)");
/* Place the block on the free list for re-use later */
t->thread_link = free_list;
free_list = t;
_unlock(thread_lock,"unlocking thread data (del)");
}
СХ>Авторы: СХ> Сергей Холодилов
СХ>Аннотация: СХ>В статье описаны некоторые детали программирования служб Windows NT/2000/XP. Большая часть содержащихся в статье утверждений описывает реакцию Windows на какие-то действия службы. Если вы написали первую службу и хотите двигаться дальше, эта статья вам поможет.
А каким образом заставить сервисв примере работать в SafeMode 2000/XP?
СХ>Авторы: СХ> Сергей Холодилов
СХ>Аннотация: СХ>В статье описаны некоторые детали программирования служб Windows NT/2000/XP. Большая часть содержащихся в статье утверждений описывает реакцию Windows на какие-то действия службы. Если вы написали первую службу и хотите двигаться дальше, эта статья вам поможет.
Здравствуйте,
Вопрос: при удалении службы, удаляется и ключ реестра хранения MyServiceEventSource, а как же быть с dll которая занята процессом EvengLog?
СХ>Авторы: СХ> Сергей Холодилов
СХ>Аннотация: СХ>В статье описаны некоторые детали программирования служб Windows NT/2000/XP. Большая часть содержащихся в статье утверждений описывает реакцию Windows на какие-то действия службы. Если вы написали первую службу и хотите двигаться дальше, эта статья вам поможет.
Отличная статья. Я Написал сервис на основе этой статьи (простенький тсп-сервер), только затруднение вызвала ф-ция ServiceMain, пропару в ней допустил, флажок один не указал. Не хотелось тупо передирать из статьи, х0телось понять как работает. Вобщем всё ясно с сервисами, во время действий ни одно животное не пострадало % ) Комп перегружал раз 30. Там фишка, что не удалишь сервис, пока комп не перегрузишь, если неправильно что-то сделал в службе.
А как насчет Window Server 2003?
Ни serv, ни serv_tiny не запустились Пишут ошибка 5 — access denied.
Правда, если я их запускаю не под Local System, а под конкретным именем, то запускаются. В чем может быть дело? Заранее спасибо за ответ.
Это еще не все особенности...
Во первых в Win2003 в SericeMain не передаются параметры и второе — не устанавливается текущим фолдер откуда было запущено приложение, а остается в System32 — откуда запускается ServiceManager.
N>Это еще не все особенности... N>Во первых в Win2003 в SericeMain не передаются параметры и второе — не устанавливается текущим фолдер откуда было запущено приложение, а остается в System32 — откуда запускается ServiceManager.
Параметры передаются, только что проверил. А system32 на всех системах для служб устанавливается как текущая папка. В общем, зачем народ зря пугаете, а?
2potap — используйте SFL для построения служб. Все нормально запускается.
1) А что такое SFL? Где о нём почитать?
2) Так я не понял, приложенные к статье сервисы только у меня не запускаются или у всех на Win 2003 под Local System? Как их (или настройки винды) подправить, чтобы запускались?
Здравствуйте, Andrew S, Вы писали:
N>>Это еще не все особенности... N>>Во первых в Win2003 в SericeMain не передаются параметры и второе — не устанавливается текущим фолдер откуда было запущено приложение, а остается в System32 — откуда запускается ServiceManager.
AS>Параметры передаются, только что проверил. А system32 на всех системах для служб устанавливается как текущая папка. В общем, зачем народ зря пугаете, а?
AS>2potap — используйте SFL для построения служб. Все нормально запускается.
P>Спасибо за ответы.
P>1) А что такое SFL? Где о нём почитать?
В "Исходниках".
P>2) Так я не понял, приложенные к статье сервисы только у меня не запускаются или у всех на Win 2003 под Local System? Как их (или настройки винды) подправить, чтобы запускались?
Не знаю, меня эти сервисы не интересовали. Попробуйте устанавливать эти сервисы при помощи sc.exe, а не встроенными инсталляторами. Встроенные инсталляторы, вообще говоря, не совсем удачны.
Здравствуйте, potap, Вы писали:
P>А как насчет Window Server 2003? P>Ни serv, ни serv_tiny не запустились Пишут ошибка 5 — access denied. P>Правда, если я их запускаю не под Local System, а под конкретным именем, то запускаются. В чем может быть дело?
Сорри, под рукой нету 2003-й. Найду — посмотрю. Когда статья писалась такой системы ещё не существовало
Здравствуйте, Andrew S, Вы писали:
AS> Попробуйте устанавливать эти сервисы при помощи sc.exe, а не встроенными инсталляторами. Встроенные инсталляторы, вообще говоря, не совсем удачны.
Что подразумевается под "встроенными инсталляторами"? Почему неудачны?
P>2) Так я не понял, приложенные к статье сервисы только у меня не запускаются или у всех на Win 2003 под Local System? Как их (или настройки винды) подправить, чтобы запускались?
попробовал serv_tiny (ShutdownCounter) на win2003 sp2 — установился, под Local System запускается