1. 用C语言编写Windows服务程序的五个步骤
Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并实现一个简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件。最后,你可以用所学知识编写自己的 Windows 服务。 当初我写第一个 NT 服务时,我到 MSDN 上找例子。在那里我找到了一篇 Nigel Thompson 写的文章:“Creating a Simple Win32 Service in C++”,这篇文章附带一个 C++ 例子。虽然这篇文章很好地解释了服务的开发过程,但是,我仍然感觉缺少我需要的重要信息。我想理解通过什么框架,调用什么函数,以及何时调用,但 C++ 在这方面没有让我轻松多少。面向对象的方法固然方便,但由于用类对底层 Win32 函数调用进行了封装,它不利于学习服务程序的基本知识。这就是为什么我觉得 C 更加适合于编写初级服务程序或者实现简单后台任务的服务。在你对服务程序有了充分透彻的理解之后,用 C++ 编写才能游刃有余。当我离开原来的工作岗位,不得不向另一个人转移我的知识的时候,利用我用 C 所写的例子就非常容易解释 NT 服务之所以然。
2. 怎么把一个程序写入服务
要把应用程序添加为服务,你需要两个小软件:Instsrv.exe和Srvany.exe。Instsrv.exe可以给系统安装和删除服务, Srvany.exe可以让程序以服务的方式运行。这两个软件都包含在Windows NT Resource Kit里,如果你没有,自己下载
把这两个程序保存在一个方便的位置,例如C盘根目录下。举例来说明,把OE作为一个服务添加进Windows XP Professional操作系统中,并把这个服务命名为“Mail”。在运行中输入“CMD”,回车,打开命令行窗口,在提示符后面直接输入:“c:\ instsrv.exe Mail c:\srvany.exe”然后回车,其中的“c:\instsrv.exe”和“c:\srvany.exe”表示这两个程序保存的位置,而Mail 则是你想添加的服务名称。
运行Regedit打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 下,找到刚才添加的Mail,点击右键,新建一个键,命名为“Parameters”,点击新建的Parameters,并再次新建一个名称为 “Application”的子键,数据类型为“REG_SZ”,数值为希望作为服务运行的程序的所在位置,如果你的Windows系统安装在C盘下,那么OE的程序位置就是C:\Program Files\Outlook Express\msimn.exe ,把这个路径添入数值中。到现在,这个服务已经成功的添加并且设置好了。如果你希望做的更加专业,可以在Mail服务下建立一个名为 Description的子键,数据类型同样为REG_SZ,数值可以写一些你对这个服务的描述
接下来需要对服务做一些额外的设置,在运行中输入“Services.msc”并回车,在列表中找到我们刚添加的Mail服务,双击打开,来做详细的设置。在“General”选项卡上,我们需要设置这个服务的运行方式,在图二中可以看见,作为一个服务,有“自动(Automatic)”,“手动(Manual)”和“禁止(Disabled)”三种启动类型,按照需要,我们一般设置成自动就可以了。而在“Logon”选项卡下可以设置以什么身份运行这个服务,一般可以不用理会,按照默认的设置。“Recovery”选项卡下则是进行恢复设置的,你可以指定,在服务第一次,第二次和第三次出错之后分别采取什么措施。“Dependencies”则显示了服务之间的依存关系,可以让你察看这个服务的运行依赖哪些其它服务,以及还有什么服务依赖于这个服务。这后面几个对我们一般用户没有什么意义。经过这些设置,你的服务已经完全可以正常工作了。
注销一下看看。为了让你看清除,先打开OE,这时在任务管理器里,有两个msimn进程,用户名为“.com.cn”的是打开的OE,而用户名为“SYSTEM”的就是添加的服务。
如果你不想再运行这个服务,可以直接禁止它在启动的时候运行,或者使用Instsrv.exe程序删除。方法是在命令行下输入“c:\ instsrv.exe Mail remove”,然后回车就可以了。需要注意的是Instsrv.exe这个程序也可以删除某些系统服务,所以使用的时候一定要小心,对于系统服务,安全起见千万不要删除,哪怕你觉得它对你没有用。
3. 如何用C语言来编写一个管理系统服务的程序
这个是删除服务的函数。。不过动的API,,你还是补习补习吧
BOOL Uninstall()
{
if ( !IsInstalled() )
return TRUE;
SC_HANDLE hSCM = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if ( hSCM == NULL )
{
//MessageBox( NULL, _T( "打开服务管理器失败!" ), szServiceName, MB_OK );
return FALSE;
}
SC_HANDLE hService = OpenService( hSCM, szServiceName, SERVICE_STOP | DELETE );
if ( hService == NULL )
{
CloseServiceHandle( hSCM );
MessageBox( NULL, _T( "服务不存在!" ), szServiceName, MB_OK );
return FALSE;
}
SERVICE_STATUS status;
ControlService( hService, SERVICE_CONTROL_STOP, &status );
BOOL bDelete = DeleteService( hService );
CloseServiceHandle( hService );
CloseServiceHandle( hSCM );
if ( bDelete )
{
MessageBox( NULL, _T( "删除服务成功!" ), szServiceName, MB_OK );
return TRUE;
}
MessageBox( NULL, _T( "删除服务失败!" ), szServiceName, MB_OK );
//LogEvent(_T("Service could not be deleted"));
return FALSE;
}
调用API函数OpenSCManager()和连接SCM(服务控制管理器)
调用API函数OpenService()打开服务,有2个参数,一个为服务名,一个为执行权限;返回服务句柄
启动服务StartService();第一个参数就是服务句柄
停止服务ControlService()和上面的一样
QueryServiceStatus()查询服务当前状态,这个函数填充一个SERVICE_STATUS类型结构,获取服务当前的一些信息
4. C语言中断端服务程序怎么编写啊
/**************************标准写法如下*****************************************************/
void name (void) interrupt 中断号 using 工作寄存器组号
{
//中断处理内容
}
/**********************************************************************************************/
/*******************************[中断入口说明]************************************
interrupt 0 外部中断0(ROM入口地址:0x03)
interrupt 1 定时/计数器中断0(ROM入口地址:0x0B)
interrupt 2 外部中断1(ROM入口地址:0x13)
interrupt 3 定时/计数器中断1(ROM入口地址:0x1B)
interrupt 4 UART串口中断(ROM入口地址:0x23)
(更多的中断依单片机型号而定,ROM中断入口均相差8个字节)
using 0 使用寄存器组0
using 1 使用寄存器组1
using 2 使用寄存器组2
using 3 使用寄存器组3
using 寄存器号 ====可以不写,不写则用第0组
***********************************************************************************/
5. 如何边写windows服务程序
这两天想学习关于如何编写windows服务程序的知识,就上网查了些资料。
看了一篇文章《用C 语言编写Windows 服务程序的五个步骤》。但可能由于译者的疏忽,忘记了将关键代码放入该文档,导致初学者可能会看不懂。
所以又查阅了相关资料。自己完成了《用C 语言编写Windows 服务程序的五个步骤》中的样例程序。
在本文中我希望能给初学者一些帮助,大致讲一下编写windows服务程序需要的知识。 首先Microsoft Windows 服务(即,以前的NT 服务)使您能够创建在它们自己的Windows 会话中可长时间运行的可执行应用程序。
这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。
还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。 服务是有状态的,当我们使用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赋值设定的。 这样一个基本的服务程序就完成了。
下面贴出我的示例代码仅供参考。该代码在vs2008中调试通过。
本文结束的时候会附上如何安装服务。 #include
6. 用C#写了一个控制台程序,如何让它作为服务来运行
要把应用程序添加为服务,你需要两个小软件:Instsrv.exe和Srvany.exe。
Instsrv.exe可以给系统安装和删除服务,Srvany.exe可以让程序以服务的方式运行。这两个软件都包含在Windows NT Resource Kit里。
把这两个程序保存在一个方便的位置,例如C盘根目录下。
我们举例来说明,把OE作为一个服务添加进Windows XP Professional操作系统中,并把这个服务命名为“Mail”。
在运行中输入“CMD”,回车,打开命令行窗口,在提示符后面直接输入:“c:\instsrv.exe Mail c:\srvany.exe”然后回车,其中的“c:\instsrv.exe”和“c:\srvany.exe”表示这两个程序保存的位置,而Mail则是你想添加的服务名称。
运行Regedit打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,找到刚才添加的Mail,点击右键,新建一个键,命名为“Parameters”,点击新建的Parameters,并再次新建一个名称为“Application”的子键,数据类型为“REG_SZ”,数值为希望作为服务运行的程序的所在位置,如果你的Windows系统安装在C盘下,那么OE的程序位置就是C:\Program Files\Outlook Express\msimn.exe ,把这个路径添入数值中。
到现在,这个服务已经成功的添加并且设置好了。如果你希望做的更加专业,可以在Mail服务下建立一个名为Description的子键,数据类型同样为REG_SZ,数值可以写一些你对这个服务的描述,这个我们在后面可以看到。
接下来需要对服务做一些额外的设置,在运行中输入“Services.msc”并回车,在列表中找到我们刚添加的Mail服务,双击打开,来做详细的设置。
在“General”选项卡上,我们需要设置这个服务的运行方式,可以看见,作为一个服务,有“自动(Automatic)”,“手动(Manual)”和“禁止(Disabled)”三种启动类型,按照需要,我们一般设置成自动就可以了。而在“Logon”选项卡下可以设置以什么身份运行这个服务,一般可以不用理会,按照默认的设置。“Recovery”选项卡下则是进行恢复设置的,你可以指定,在服务第一次,第二次和第三次出错之后分别采取什么措施。“Dependencies”则显示了服务之间的依存关系,可以让你察看这个服务的运行依赖哪些其它服务,以及还有什么服务依赖于这个服务。这后面几个对我们一般用户没有什么意义。经过这些设置,你的服务已经完全可以正常工作了。
注销一下看看。为了让你看清除,我们先打开OE,这时在任务管理器里,有两个msimn进程,用户名为“.com.cn”的是我们打开的OE,而用户名为“SYSTEM”的就是我们添加的服务。
如果你玩够了,不想再运行这个服务,可以直接禁止它在启动的时候运行,或者使用Instsrv.exe程序删除。方法是在命令行下输入“c:\instsrv.exe Mail remove”,然后回车就可以了。需要注意的是Instsrv.exe这个程序也可以删除某些系统服务,所以使用的时候一定要小心,对于系统服务,安全起见千万不要删除,哪怕你觉得它对你没有用。
7. C++写的服务程序,如何获得当前执行程序所在目录
char szPathTemp[512];
GetModuleFileName(NULL, szPathTemp, 512);
//取出文件路径
for (int i=strlen(szPathTemp); i>=0; i--)
{
if (szPathTemp[i] == '\\')
{
szPathTemp[i] = '\0';
break;
}
}
这样试试,我用没问题