Windows Service C - PullRequest
       20

Windows Service C

1 голос
/ 12 октября 2011

Я написал службу Windows на C, но отсутствие документации по написанию службы на этом языке означает, что у меня есть несколько вещей, с которыми мне нужна помощь.

  1. Я хочу создать файл конфигурации, который служба читает, чтобы получить несколько настроек / опций. Мне интересно, что лучший способ сделать это и как это сделать. Служба .exe будет установлена ​​вместе с другими файлами / программами в указанном пользователем месте. Первый вопрос, который у меня возникает, должен ли я сохранить этот файл конфигурации в том же каталоге, что и служба .exe, или поместить его в папку% appdata%, которую я создаю для своих программ?

  2. Как служба сможет найти файл конфигурации. Должен ли я сохранить расположение файла конфигурации в реестре и жестко закодировать ключ реестра в службе? Или возможно установить службу так, чтобы она имела путь к файлу конфигурации в качестве аргумента командной строки по умолчанию? Или я должен сохранить свой конфигурационный файл в той же папке, что и служба .exe и использовать реестр HKLM/System/CurrentControlSet/Services/<servicename>/ImagePath?

  3. У меня есть следующий код:

void main() {
    SERVICE_TABLE_ENTRY ServiceTable[2];
    ServiceTable[0].lpServiceName = L"Service Name";
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;
    // Start the control dispatcher thread for our service
    StartServiceCtrlDispatcher(ServiceTable);
}
void ServiceMain(int argc, char** argv) { 
    //stuff here
}

Откуда ServiceMain получает аргументы командной строки, это поле «Начальные параметры:» в свойствах конкретной службы? Возможно ли установить его с некоторыми параметрами по умолчанию? Можно ли добавить некоторые из них позже программно?

  1. Можно ли условно запустить мой сервис при запуске другого сервиса?

  2. Как я могу установить этот сервис на производстве? Я использовал sc из Windows SDK для разработки, но это не будет работать в производстве. Это единственный способ сделать это, убедиться, что Microsoft .NET Framework установлен, а затем запустить программу installutil? Мой сервис написан без использования .net framework, поэтому я надеялся, что будет способ установить сервис без установки .net

Бонус Вопрос: Моя служба выводит в файл журнала. Возможно ли проверить его размер и удалить его, если размер файла превышает произвольный размер?

PS Я не знаю, почему список сбрасывается на 1 и 2 после кода, в окне редактирования четко указаны 4 и 5.

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Многие службы используют следующий подраздел реестра для хранения значений конфигурации:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \\ Параметры

2 голосов
/ 12 октября 2011
  1. Поскольку служба предназначена для всего компьютера, а не для пользователя, сохраните файл конфигурации в CSIDL_COMMON_APPDATA.
  2. Позвоните SHGetFolderPath, передав CSIDL_COMMON_APPDATA, чтобы узнать, где находится эта папка.
  3. Аргументы командной строки argv поступают из командной строки, указанной при регистрации службы. Это то, что вы можете увидеть в диспетчере управления службами.

Я не отвечал на второй набор вопросов. Вы действительно должны задавать только один вопрос за раз. Хотя я немного знаю об установке сервисов. Вам, конечно, не нужно никаких .net. Как именно вы должны это сделать, вероятно, зависит от того, какой инструмент установки вы используете.

...