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的定义。