Windows Service 要注意的几点

来源:互联网 发布:淘宝充话费没法退款 编辑:程序博客网 时间:2024/05/16 01:34

http://msdn.microsoft.com/en-us/library/bb540475(v=VS.85).aspx

1.程序类型:Win32 Console Application

2.几个主要的函数类型

VOID WINAPI SvcCtrlHandler( DWORD );

VOID WINAPI SvcMain( DWORD, LPTSTR * );

void __cdecl _tmain(int argc, TCHAR *argv[])

如果函数据类型不对,有可能在你停止service时随机收到0x00000000指令读取0x00000000地址非法的错误。

3. service 的安装类型

SC_HANDLE  schService= CreateService(

                              schSCManager,              // SCManager database

                              pszSvcName,              // name of service

                              pszDisplayName,           // service name to display

                              SERVICE_ALL_ACCESS,        // desired access

                              SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS, // service type

                              SERVICE_AUTO_START,      // start type

                              SERVICE_ERROR_IGNORE,      // error control type

                              pszPathName,        // service's binary

                              NULL,                      // no load ordering group

                              NULL,                      // no tag identifier

                              NULL,                      // no dependencies

                              NULL,                      // LocalSystem account

                              NULL);                     // no password

如果要和系统有键盘消息则需要SERVICE_INTERACTIVE_PROCESS。

像发送Ctrl+Alt+Del消息

keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); 

               keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),0,0); 

               keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),0,0); 

 

               keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0);

               keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);

               keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),KEYEVENTF_KEYUP,0);

 

4.如何调试service.

Service 是一个exe程序。当启动时可以在taskmgr中看到。StartServiceCtrlDispatcher函数将会阻塞,直到用户在services.msc中停止service.

调试方法如下:

在services.msc中启动service, 然后attach到这个进程上进行调试。

原创粉丝点击