2011-10-12 88 views
1

我已经用C语言编写了一个Windows服务,但缺乏用这种语言编写服务的文档意味着我需要一些帮助。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. 我怎么能安装在生产这种服务?我一直在使用Windows SDK的sc进行开发,但这不适用于生产。唯一的方法是确保安装微软.net框架,然后运行installutil程序?我的服务输出到一个日志文件:我的服务,而无需使用.NET框架,所以我本来希望会有一个方式,而无需安装.NET

加分题安装服务写入的。是否有可能检查文件的大小,如果超过任意文件大小,是否可以删除它?

PS我不知道为什么列表中的代码后,重置为1 & 2,它显然在编辑框中说,4和5。

+0

提供的ServiceMain的参数是那些给StartService,如记录HTTP:// msdn.microsoft.com/en-us/library/ms685138%28VS.85%29.aspx –

回答

2
  1. 由于服务是机器范围的而不是每个用户,因此将配置文件存储在CSIDL_COMMON_APPDATA下。
  2. 呼叫SHGetFolderPath传递CSIDL_COMMON_APPDATA找出该文件夹。
  3. 命令行参数argv来自服务注册时指定的命令行。这是您可以从服务控制管理器看到的。

我没有提到第二组问题。你应该一次只问一个问题。尽管我对安装服务有所了解。你当然不需要任何.net。准确地说,你应该怎么做,这可能取决于你使用的安装工具。

+0

感谢您的回复。我看过SHGetFolderPath,但我不太清楚如何包含dll的。你能告诉我从哪里下载它们,以及如何将它们包含在Visual Studio 2010项目中?我的安装工具是NSIS,我应该使用它来制作appdata文件夹吗?我见过一些C++服务代码,它们在第一次运行时自行安装。 – Michael

+0

太多的问题!不知道DLL在哪里进入。是的,您使用安装程序来编写配置文件,假设安装时提供的信息。运行时不安装服务。他们不能运行,直到安装。鸡和鸡蛋。 –

+0

大声笑,抱歉的问题... SHGetFolderPath需要一个外部库,我从哪里得到shell32.lib/shell32.dll?我正在谈论文件夹的创建。当您在不存在的目录中打开文件时,Windows会自动创建文件夹吗?哦,该服务有一个命令行参数安装,然后将安装它,而不是调用服务控制调度器。 .exe可以由安装程序使用cmd行参数运行。 – Michael

2

许多服务使用以下注册表子项来保存配置值:

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\\参数