vs2008下windows服务的创建、安装以及调试

http://blog.sina.com.cn/s/blog_4b46937b0101pbxz.html


1、新建windows服务。

2、主要文件UpdateFileWinService.h和UpdateFileWinService.cpp(UpdateFile项目名称)

UpdateFileWinService.h中定义了托管类UpdateFileWinService (关键字ref)

public ref class UpdateFileWinService : publicSystem::ServiceProcess::ServiceBase

添加代码为红色:

namespace UpdateFile {

  //托管类,实现对文件夹中的文件进行监控 [9/4/2013 CDD]
 public ref class FileWatcher
 {
 public:
  FileWatcher()
  {
   fsWatcher=gcnew FileSystemWatcher();
   countAdd=0;
   m_FilePath="F:\";
  }
  voidsetFilePath(String^filePath)
  {
  m_FilePath=filePath;
  }
  String^getChangedFile()//获取变换的文件
  {
  return m_NewFilePath;
  }
  int run()
  {
   fsWatcher->Path= m_FilePath;
   //设置缓冲区大小1M,根据需求设置
   fsWatcher->InternalBufferSize= 1048576;

   //监听文件、目录、文件大小的改变
   fsWatcher->NotifyFilter= static_cast
    (NotifyFilters::FileName|
    NotifyFilters::DirectoryName|
    NotifyFilters::Size);

   //监听子目录
   fsWatcher->IncludeSubdirectories= true;

   //添加事件处理程序
   FileWatcher^handler = gcnew FileWatcher();
   fsWatcher->Created+= gcnew FileSystemEventHandler(handler,&FileWatcher::OnChanged);
   //开始监听
   fsWatcher->EnableRaisingEvents= true;
   return0;
  }
 private:
  void OnChanged (Object^ source,FileSystemEventArgs^ e)
  {
   countAdd++;
   m_NewFilePath=e->FullPath;
   WritePrivateProfileString("改变的文件","文件路径",(char*)(void*)Marshal::StringToHGlobalAnsi(m_NewFilePath),"F:/test/WindowsServe/UpdateFile/serve.ini");

//在这个函数中定义某一路径下的文件发生改变时触发一定的行为
  }

 private:
  String^ m_FilePath;
  String^ m_NewFilePath;
  FileSystemWatcher^fsWatcher;
  int countAdd;

 };


 ///
 /// UpdateFileWinService 摘要
 ///
 ///
 /// 警告: 如果更改此类的名称,则需要更改
 ///         与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的
 ///         “资源文件名”属性。否则,
 ///         设计器将不能与此窗体的关联
 ///         本地化资源正确交互。
 public ref class UpdateFileWinService : publicSystem::ServiceProcess::ServiceBase
 {
 public:
  UpdateFileWinService()
  {
   InitializeComponent();
   //
   //TODO:在此处添加构造函数代码
   //
   m_fileWatcher=gcnewFileWatcher();

  }
  
 protected:
  ///
  /// 清理所有正在使用的资源。
  ///
  ~UpdateFileWinService()
  {
   if(components)
   {
    deletecomponents;
   }
  }

  ///
  /// 设置具体的操作,以便服务可以执行它的工作。
  ///
  virtual void OnStart(array^args) override
  {
   // TODO:在此处添加代码以启动服务。
     m_fileWatcher->run();
  }

  ///
  /// 停止此服务。
  ///
  virtual void OnStop()override
  {
   // TODO:在此处添加代码以执行停止服务所需的关闭操作。
    }


 private:
  ///
  /// 必需的设计器变量。
  ///
  System::ComponentModel::Container^components;
  FileWatcher^m_fileWatcher;

 public:
  #pragma region Windows FormDesigner generated code
  ///
  /// 设计器支持所需的方法 - 不要
  /// 使用代码编辑器修改此方法的内容。
  ///
  voidInitializeComponent(void)
  {
   this->components= gcnew System::ComponentModel::Container();
   this->CanStop= true;
   this->CanPauseAndContinue= true;
   this->AutoLog= true;
   this->ServiceName= L"UpdateFileWinService";
    }

  
#pragma endregion

 };

}

这样windows服务的主题已经编辑完毕。

3、添加安装程序类。

右击项目名称->添加类->安装程序类。

主要文件:InstallServe.h和InstallServe.cpp

打开InstallServe.h添加代码:

#pragma once

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Configuration::Install;


namespace UpdateFile {

 [RunInstaller(true)]

 ///
 /// InstallServe 摘要
 ///
 public ref class InstallServe : publicSystem::Configuration::Install::Installer
 {
 public:
  InstallServe(void)
  {
   InitializeComponent();
   //
   //TODO:在此处添加构造函数代码
   //
  }

 protected:
  ///
  /// 清理所有正在使用的资源。
  ///
  ~InstallServe()
  {
   if(components)
   {
    deletecomponents;
   }
  }

 private:
  ///
  /// 必需的设计器变量。
  ///
  System::ComponentModel::Container^components;
  System::ServiceProcess::ServiceProcessInstaller^spInstaller;
  System::ServiceProcess::ServiceInstaller^sInstaller;

#pragma region Windows Form Designer generated code
  ///
  /// 设计器支持所需的方法 - 不要
  /// 使用代码编辑器修改此方法的内容。
  ///
  voidInitializeComponent(void)
  {
   this->components = gcnewSystem::ComponentModel::Container();

   //创建ServiceProcessInstaller对象和ServiceInstaller对象
   this->spInstaller=gcnew System::ServiceProcess::ServiceProcessInstaller();
   this->sInstaller= gcnew System::ServiceProcess::ServiceInstaller();

   //设定ServiceProcessInstaller对象的帐号、用户名和密码等信息
   this->spInstaller->Account=System::ServiceProcess::ServiceAccount::LocalSystem;
   this->spInstaller->Username= nullptr;
   this->spInstaller->Password= nullptr;

   //设定服务名称
   this->sInstaller->ServiceName= "UpdateFileWinService";

   //设定服务的启动方式
   this->sInstaller->StartType=System::ServiceProcess::ServiceStartMode::Automatic;
   //array^install={this->spInstaller,this->sInstaller};//注意array的定义 [9/5/2013 CDD]
   //this->Installers->AddRange(install);
   // 或者使用如下形式[9/5/2013 CDD]
   this->Installers->AddRange(gcnewarray{this->spInstaller,this->sInstaller});
  }
#pragma endregion
 };
}
编译。

4、安装自创建的windows服务。

使用工具InstallUtil.exe进行安装和卸载创建的windows服务

安装:C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/InstallUtil.exe F:\test\WindowsServe\UpdateFile\Debug\UpdateFile.exe

其中:FilePath为你创建的项目的运行exe文件所在目录,

卸载:

C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/InstallUtil.exe -uF:\test\WindowsServe\UpdateFile\Debug\UpdateFile.exe

5、安装成功后,启动服务。

右击我的电脑->管理->服务与应用程序->服务。找到创建的服务名字,右击“启动”服务。

6、调试

VS2008的调试菜单->附加到进程->选择服务的进程->确定,在合适的地方设置断点。

修改代码重新编译后,需要重新安装服务,在此之前先要停止服务并卸载服务。

///

遇到问题说明:

1、因为是托管类,所以使用gcnew关键字表示在托管堆上分配内存,与以前的指针进行区分用^替换*。

2、 FileSystemEventHandler为委托构造函数,能够被委托的函数必须是类的非成员函数或者是静态成员函数。或者此格式非静态调用成员函数fsWatcher->Created+= gcnew FileSystemEventHandler(handler,&FileWatcher::OnChanged);其中&FileWatcher::OnChanged为获取被委托函数的地址。

3、注意array的定义。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值