
服务是有状态的,当我们使用windows自带的服务管理程序sc.exe查看服务状态时可以显示服务的当前状态,这个状态是由我们在程序代码中进行控制的。你袜激最好在服务初始化的时候将服务设置为SERVICE_START_PENDING,当初始化完毕时设为SERVICE_RUNNING,这些状态是系统自定义的状态,可通过msdn查看其他状态。这个状态信肢好衫息你会在sc.exe中看到。
在编写windows服务程序过程中你需要关注的函数有:
1.首先是main函数,由于windows服务不需要界面,所以大部分程序为win32控制台应用程序,所以程序主函数为main 而不是WinMain()。在主函数要做的主要工作就历腔是初始化一个SERVICE_TABLE_ENTRY 分派表结构体,然后调用StartServiceCtrlDispatcher()这将把调用进程的主线程转换为控制分派器。该分派器启动一个新线程,该线程运行分派表中对应于你的服务的ServiceMain()函数。ServiceMain()函数将在下面提到。
此过程示例代码如下:
SERVICE_TABLE_ENTRY entrytable[2]
entrytable[0].lpServiceName="testservice"
entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain
entrytable[1].lpServiceName=NULL
entrytable[1].lpServiceProc=NULL
StartServiceCtrlDispatcher(entrytable)
在这之后系统将自动创建一个线程去执行ServiceMain函数的内容,你应该将你要执行的任务在ServiceMain中循环,这样服务就开始运行了。
2.ServiceMain函数为void WINAPI ServiceMain(int argc, char** argv)格式的函数,函数名字可以任意定义。它的作用就是:将你需要执行的任务放到该函数中循环执行即可。这就是服务程序的工作函数。在ServiceMain执行你的任务前,需要给SERVICE_TABLE_ENTRY 分派表结构体进行赋值,注意由于此时服务还没有开始执行你的任务所以我们将服务的状态设置为SERVICE_START_PENDING,即正在初始化。我们进行如下赋值:
servicestatus.dwServiceType = SERVICE_WIN32
servicestatus.dwCurrentState = SERVICE_START_PENDING
servicestatus.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP
//在本例中只接受系统关机和停止服务两种控制命令
servicestatus.dwWin32ExitCode = 0
servicestatus.dwServiceSpecificExitCode = 0
servicestatus.dwCheckPoint = 0
servicestatus.dwWaitHint = 0
hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler)
CtrlHandler为void WINAPI CtrlHandler(DWORD request)型的函数,函数名字可以任意设定。将在下一点讲到。
Hstatus为SERVICE_STATUS_HANDLE类型的全局变量。当需要改变服务状态时SetServiceStatus()函数需要它做为参数来标识一个服务。
3. void WINAPI CtrlHandler(DWORD request),函数的主要功能是,接收系统传递的控制命令,比如当你通过sc.exe关闭服务时,该函数会收到SERVICE_CONTROL_STOP消息,你就可以对服务进行必要的管理。在本例子程序中就只接收SERVICE_ACCEPT_SHUTDOWN和SERVICE_ACCEPT_STOP消息,这是通过前面给servicestatus赋值设定的。
方法一:如何实现在Windows7下编写Linux程序,写完程序以后,不用拷贝文件,直接在Linux(RHEL6.5)机器上编译最新的代码。首先将Windows的代码文件夹设置为共享文件夹:在RHEL6.5上,利用mount命令把Win7下的文件夹给mount到本地的一个文件夹其中192.168.59.1是Win7的OS,VMTool是本地的嫌胡一个文件夹。在~/.bash_profile中添加如下行,这样每次启动的时候,就会自动mount这个文件夹。mount//192.168.59.1/DIMMTool/root/Desktop/DIMM-ousername=zxj1988,password=2720142V方法二:利用SAMBA,设置Linux中的文件夹为共享文件夹,在Windows下直接访问共享文件夹。1.安装samba:1.1rpm-qa|grepsamba如果以上的命令的结果为空,证明Linux上没有安装samba。需要安装samba1.2挂载RHEL6.5安装镜像,并进入到该文件夹中来。1.31.4进入到Package目录下1.5ls|grepsamba1.6利用rpm-ivhsambaXXX命令去安装相应的samba包。安装好以后,再跑rpm-qa|grepsamb会得到如下结果:可以通过servicesmb来判断smb是否安装成功2.配置共享文件夹2.1新建共享文件夹,如mkdir/home/test注意:不要创建在/root目录下,否则只有windows的administrator,admin两个用户才能访问得到。2.2设置其共享权限chmod777/home/test2.3设置其所有者chown-Rnobody/home/test如果Windows的登录用户是administrator或者admin的话,就不用2.3的设置。对于Windows的其他用户,如果没有2.3的设置,那么他是无法修改test目录下的文件的。2.4编辑/etc/samba/smb.conf,将/home/test设置为可共享的目录。·vim/etc/samba/smb.conf··找到security这行并将#注释符号芹袭拦去掉改成·security=share#共享模式··添加如下代码:··[share]·comment=share·path=/home/test#设置共享文件夹目录·browseable=yes·guestok=yes·writable=yes·2.5重启smb服务,使sbm.conf的新配置生效servicesmbrestart3.关闭系统防火墙,并且将sellinux设置为disabled。否则会出现windows下能够看到linux共享的目录,但是看不禅李到文件的现象。设置sellinux为disabled的方法如下:[root@localhost~]#vim/etc/selinux/config将SELINUX=enforcing改成SELINUX=disabled保存[root@localhost~]#reboot或init64.在windows下访问//[linux_ip]来访问共享文件看你样子是个C#的0级新手。(1)
private void button1_Click(object sender, EventArgs e)
{
double a, b
if(textBox1.Text.Trim()==string.Empty||textBox2.Text.Trim()==string.Empty)//判断是运凳否为空
{
MessageBox.Show("不能为空!"旁册旅);
return;
}
if(!double.TryParse(textBox1.Text,out a) || !double.TryParse(textBox1.Text,out b))
{
MessageBox.Show("输入有误!");
return
}
textBox3.Text = (a * b).ToString()
}
这问题也太多有太easy了,可以加我QQ(1009214494),姿猛我用vs写给你。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)