怎么把程序作为服务来运行? 怎么把程序设置成服务启动

\u5982\u4f55\u5c06\u7a0b\u5e8f\u4f5c\u4e3a\u7cfb\u7edf\u670d\u52a1\u542f\u52a8

\u8981\u628a\u5e94\u7528\u7a0b\u5e8f\u6dfb\u52a0\u4e3a\u670d\u52a1\uff0c\u4f60\u9700\u8981\u4e24\u4e2a\u5c0f\u8f6f\u4ef6\uff1aInstsrv.exe\u548cSrvany.exe\u3002Instsrv.exe\u53ef\u4ee5\u7ed9\u7cfb\u7edf\u5b89\u88c5\u548c\u5220\u9664\u670d\u52a1\uff0cSrvany.exe\u53ef\u4ee5\u8ba9\u7a0b\u5e8f\u4ee5\u670d\u52a1\u7684\u65b9\u5f0f\u8fd0\u884c\u3002\u8fd9\u4e24\u4e2a\u8f6f\u4ef6\u90fd\u5305\u542b\u5728Windows NT Resource Kit\u91cc\u3002\u628a\u8fd9\u4e24\u4e2a\u7a0b\u5e8f\u4fdd\u5b58\u5728\u4e00\u4e2a\u65b9\u4fbf\u7684\u4f4d\u7f6e\uff0c\u4f8b\u5982C\u76d8\u6839\u76ee\u5f55\u4e0b\u3002\u6211\u4eec\u4e3e\u4f8b\u6765\u8bf4\u660e\uff0c\u628aOE\u4f5c\u4e3a\u4e00\u4e2a\u670d\u52a1\u6dfb\u52a0\u8fdbWindows XP Professional\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\u5e76\u628a\u8fd9\u4e2a\u670d\u52a1\u547d\u540d\u4e3a\u201cMail\u201d\u3002\u5728\u8fd0\u884c\u4e2d\u8f93\u5165\u201cCMD\u201d\uff0c\u56de\u8f66\uff0c\u6253\u5f00\u547d\u4ee4\u884c\u7a97\u53e3\uff0c\u5728\u63d0\u793a\u7b26\u540e\u9762\u76f4\u63a5\u8f93\u5165\uff1a\u201cc:\instsrv.exe Mail c:\srvany.exe\u201d\u7136\u540e\u56de\u8f66\uff0c\u5176\u4e2d\u7684\u201cc:\instsrv.exe\u201d\u548c\u201cc:\srvany.exe\u201d\u8868\u793a\u8fd9\u4e24\u4e2a\u7a0b\u5e8f\u4fdd\u5b58\u7684\u4f4d\u7f6e\uff0c\u800cMail\u5219\u662f\u4f60\u60f3\u6dfb\u52a0\u7684\u670d\u52a1\u540d\u79f0\u3002\u8fd0\u884cRegedit\u6253\u5f00\u6ce8\u518c\u8868\u7f16\u8f91\u5668\uff0c\u5728HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\u4e0b\uff0c\u627e\u5230\u521a\u624d\u6dfb\u52a0\u7684Mail\uff0c\u70b9\u51fb\u53f3\u952e\uff0c\u65b0\u5efa\u4e00\u4e2a\u952e\uff0c\u547d\u540d\u4e3a\u201cParameters\u201d\uff0c\u70b9\u51fb\u65b0\u5efa\u7684Parameters\uff0c\u5e76\u518d\u6b21\u65b0\u5efa\u4e00\u4e2a\u540d\u79f0\u4e3a\u201cApplication\u201d\u7684\u5b50\u952e\uff0c\u6570\u636e\u7c7b\u578b\u4e3a\u201cREG_SZ\u201d\uff0c\u6570\u503c\u4e3a\u5e0c\u671b\u4f5c\u4e3a\u670d\u52a1\u8fd0\u884c\u7684\u7a0b\u5e8f\u7684\u6240\u5728\u4f4d\u7f6e\uff0c\u5982\u679c\u4f60\u7684Windows\u7cfb\u7edf\u5b89\u88c5\u5728C\u76d8\u4e0b\uff0c\u90a3\u4e48OE\u7684\u7a0b\u5e8f\u4f4d\u7f6e\u5c31\u662fC:\Program Files\Outlook Express\msimn.exe \uff0c\u628a\u8fd9\u4e2a\u8def\u5f84\u6dfb\u5165\u6570\u503c\u4e2d\u3002\u5230\u73b0\u5728\uff0c\u8fd9\u4e2a\u670d\u52a1\u5df2\u7ecf\u6210\u529f\u7684\u6dfb\u52a0\u5e76\u4e14\u8bbe\u7f6e\u597d\u4e86\u3002\u5982\u679c\u4f60\u5e0c\u671b\u505a\u7684\u66f4\u52a0\u4e13\u4e1a\uff0c\u53ef\u4ee5\u5728Mail\u670d\u52a1\u4e0b\u5efa\u7acb\u4e00\u4e2a\u540d\u4e3aDescription\u7684\u5b50\u952e\uff0c\u6570\u636e\u7c7b\u578b\u540c\u6837\u4e3aREG_SZ\uff0c\u6570\u503c\u53ef\u4ee5\u5199\u4e00\u4e9b\u4f60\u5bf9\u8fd9\u4e2a\u670d\u52a1\u7684\u63cf\u8ff0\uff0c\u8fd9\u4e2a\u6211\u4eec\u5728\u540e\u9762\u53ef\u4ee5\u770b\u5230\u3002\u63a5\u4e0b\u6765\u9700\u8981\u5bf9\u670d\u52a1\u505a\u4e00\u4e9b\u989d\u5916\u7684\u8bbe\u7f6e\uff0c\u5728\u8fd0\u884c\u4e2d\u8f93\u5165\u201cServices.msc\u201d\u5e76\u56de\u8f66\uff0c\u5728\u5217\u8868\u4e2d\u627e\u5230\u6211\u4eec\u521a\u6dfb\u52a0\u7684Mail\u670d\u52a1\uff0c\u53cc\u51fb\u6253\u5f00\uff0c\u6765\u505a\u8be6\u7ec6\u7684\u8bbe\u7f6e\u3002\u5728\u201cGeneral\u201d\u9009\u9879\u5361\u4e0a\uff0c\u6211\u4eec\u9700\u8981\u8bbe\u7f6e\u8fd9\u4e2a\u670d\u52a1\u7684\u8fd0\u884c\u65b9\u5f0f\uff0c\u53ef\u4ee5\u770b\u89c1\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u670d\u52a1\uff0c\u6709\u201c\u81ea\u52a8\uff08Automatic\uff09\u201d\uff0c\u201c\u624b\u52a8\uff08Manual\uff09\u201d\u548c\u201c\u7981\u6b62\uff08Disabled\uff09\u201d\u4e09\u79cd\u542f\u52a8\u7c7b\u578b\uff0c\u6309\u7167\u9700\u8981\uff0c\u6211\u4eec\u4e00\u822c\u8bbe\u7f6e\u6210\u81ea\u52a8\u5c31\u53ef\u4ee5\u4e86\u3002\u800c\u5728\u201cLogon\u201d\u9009\u9879\u5361\u4e0b\u53ef\u4ee5\u8bbe\u7f6e\u4ee5\u4ec0\u4e48\u8eab\u4efd\u8fd0\u884c\u8fd9\u4e2a\u670d\u52a1\uff0c\u4e00\u822c\u53ef\u4ee5\u4e0d\u7528\u7406\u4f1a\uff0c\u6309\u7167\u9ed8\u8ba4\u7684\u8bbe\u7f6e\u3002\u201cRecovery\u201d\u9009\u9879\u5361\u4e0b\u5219\u662f\u8fdb\u884c\u6062\u590d\u8bbe\u7f6e\u7684\uff0c\u4f60\u53ef\u4ee5\u6307\u5b9a\uff0c\u5728\u670d\u52a1\u7b2c\u4e00\u6b21\uff0c\u7b2c\u4e8c\u6b21\u548c\u7b2c\u4e09\u6b21\u51fa\u9519\u4e4b\u540e\u5206\u522b\u91c7\u53d6\u4ec0\u4e48\u63aa\u65bd\u3002\u201cDependencies\u201d\u5219\u663e\u793a\u4e86\u670d\u52a1\u4e4b\u95f4\u7684\u4f9d\u5b58\u5173\u7cfb\uff0c\u53ef\u4ee5\u8ba9\u4f60\u5bdf\u770b\u8fd9\u4e2a\u670d\u52a1\u7684\u8fd0\u884c\u4f9d\u8d56\u54ea\u4e9b\u5176\u5b83\u670d\u52a1\uff0c\u4ee5\u53ca\u8fd8\u6709\u4ec0\u4e48\u670d\u52a1\u4f9d\u8d56\u4e8e\u8fd9\u4e2a\u670d\u52a1\u3002\u8fd9\u540e\u9762\u51e0\u4e2a\u5bf9\u6211\u4eec\u4e00\u822c\u7528\u6237\u6ca1\u6709\u4ec0\u4e48\u610f\u4e49\u3002\u7ecf\u8fc7\u8fd9\u4e9b\u8bbe\u7f6e\uff0c\u4f60\u7684\u670d\u52a1\u5df2\u7ecf\u5b8c\u5168\u53ef\u4ee5\u6b63\u5e38\u5de5\u4f5c\u4e86\u3002\u6ce8\u9500\u4e00\u4e0b\u770b\u770b\u3002\u4e3a\u4e86\u8ba9\u4f60\u770b\u6e05\u9664\uff0c\u6211\u4eec\u5148\u6253\u5f00OE\uff0c\u8fd9\u65f6\u5728\u4efb\u52a1\u7ba1\u7406\u5668\u91cc\uff0c\u6709\u4e24\u4e2amsimn\u8fdb\u7a0b\uff0c\u7528\u6237\u540d\u4e3a\u201c.com.cn\u201d\u7684\u662f\u6211\u4eec\u6253\u5f00\u7684OE\uff0c\u800c\u7528\u6237\u540d\u4e3a\u201cSYSTEM\u201d\u7684\u5c31\u662f\u6211\u4eec\u6dfb\u52a0\u7684\u670d\u52a1\u3002\u5982\u679c\u4f60\u73a9\u591f\u4e86\uff0c\u4e0d\u60f3\u518d\u8fd0\u884c\u8fd9\u4e2a\u670d\u52a1\uff0c\u53ef\u4ee5\u76f4\u63a5\u7981\u6b62\u5b83\u5728\u542f\u52a8\u7684\u65f6\u5019\u8fd0\u884c\uff0c\u6216\u8005\u4f7f\u7528Instsrv.exe\u7a0b\u5e8f\u5220\u9664\u3002\u65b9\u6cd5\u662f\u5728\u547d\u4ee4\u884c\u4e0b\u8f93\u5165\u201cc:\instsrv.exe Mail remove\u201d\uff0c\u7136\u540e\u56de\u8f66\u5c31\u53ef\u4ee5\u4e86\u3002

\u5f88\u591a\u7a0b\u5e8f\u4e0d\u9700\u8981\u5355\u72ec\u7684\u670d\u52a1\uff0c\u53ea\u9700\u8981\u8fd0\u7528WINDOWS\u5df2\u5b58\u5728\u7684\u670d\u52a1\u9879\u76ee\uff1b\u6709\u7684\u7a0b\u5e8f\u5373\u4f7f\u9700\u8981\u5355\u72ec\u670d\u52a1\uff0c\u5728\u5b89\u88c5\u7684\u65f6\u5019\u4e5f\u4f1a\u81ea\u52a8\u6dfb\u52a0\u670d\u52a1\u9879\u76ee\uff0c\u5982\u5361\u5df4\u65af\u57fa\uff0c\u6df1\u5ea6\u51b0\u51bb\u7b49\u7b49\u3002

\u770b\u770b\u8fd9\u4e2a\u5c0f\u6587\uff1a
Windows\u670d\u52a1\u4e5f\u79f0\u4e3aWindows Service\uff0c\u5b83\u662fWindows\u64cd\u4f5c\u7cfb\u7edf\u548cWindows\u7f51\u7edc\u7684\u57fa\u7840\uff0c\u5c5e\u4e8e\u7cfb\u7edf\u6838\u5fc3\u7684\u4e00\u90e8\u5206\uff0c\u5b83\u652f\u6301\u7740\u6574\u4e2aWindows\u7684\u5404\u79cd\u64cd\u4f5c\u3002\u8bf8\u5982DNS\u5ba2\u6237\u7aef\u3001\u6253\u5370\u7a0b\u5e8f\u3001Windows\u66f4\u65b0\u670d\u52a1\u3001\u8ba1\u5212\u4efb\u52a1\u3001Windows\u65f6\u95f4\u670d\u52a1\u3001\u544a\u8b66\u5668\u7b49\u670d\u52a1\uff0c\u5b83\u4eec\u5173\u7cfb\u5230\u673a\u5668\u80fd\u5426\u6b63\u786e\u8fd0\u884c\u3002\u5982\u679c\u4e0d\u80fd\u9002\u5f53\u5730\u7ba1\u7406\u8fd9\u4e9b\u670d\u52a1\uff0c\u5c31\u4f1a\u5f71\u54cd\u5230\u673a\u5668\u7684\u6b63\u5e38\u64cd\u4f5c\u3002
\u4e00\u4e2a\u670d\u52a1\u9996\u5148\u662f\u4e00\u4e2aWin32\u53ef\u6267\u884c\u7a0b\u5e8f\uff0c\u6216\u8005\u662f\u662frundll32.exe\u6765\u8fd0\u884c\u4e00\u4e2a.dll\u7684\u65b9\u5f0f\u5f62\u6210\u7684\u8fdb\u7a0b\u3002
\u8ddf\u666e\u901a\u5e94\u7528\u7a0b\u5e8f\u4e0d\u4e00\u6837\uff0c\u5982\u6253\u5f00WORD\uff0c\u6709\u4e00\u4e2a\u754c\u9762\u51fa\u6765\uff0c\u4f46\u670d\u52a1\u6ca1\u6709\u7528\u6237\u754c\u9762\u3002\u4e5f\u4e0d\u80fd\u901a\u8fc7\u76f4\u63a5\u53cc\u51fb\u8fd0\u884c\u76f8\u5e94\u7684.exe\u7a0b\u5e8f\u6765\u8fd0\u884c\u3002\u90a3Windows\u53c8\u662f\u5982\u4f55\u63a7\u5236\u4e00\u4e2a\u670d\u52a1\u7684\uff1f
Windows\u7684\u670d\u52a1\u7531\u66f4\u4e0a\u4e00\u7ea7\u7684services.exe\u8fd9\u4e2a\u670d\u52a1\u6765\u7ba1\u7406\uff0c\u7531\u5b83\u6765\u7ba1\u7406\uff0c\u8d1f\u8d23\u8fdb\u884c\u670d\u52a1\u7684\u542f\u52a8\u3001\u505c\u6b62\u3001\u8fd0\u884c\uff0c\u6682\u505c\u7b49\u3002\u6211\u4eec\u6700\u5e38\u7528\u7684\u64cd\u4f5c\u5c31\u662f\u901a\u8fc7Windows\u7684\u670d\u52a1MMC\u754c\u9762\u6765\u5b8c\u6210\u76f8\u5173\u64cd\u4f5c\u3002


\u53ef\u77e5\u5e94\u7528\u7a0b\u5e8f\u548c\u670d\u52a1\u662f\u4e0d\u76f8\u540c\u7684\u3002\u4e0d\u80fd\u628a\u7a0b\u5e8f\u8bbe\u7f6e\u4e3a\u670d\u52a1\u542f\u52a8\u3002

\u82e5\u60f3\u8ba9\u7a0b\u5e8f\u968f\u673a\u542f\u52a8\uff0c\u4f60\u53ef\u4ee5\u8fd0\u7528WINDOWS\u7684\u8ba1\u5212\u4efb\u52a1\uff0c\u8fd9\u662f\u4e2a\u5f88\u597d\u7528\u7684\u4e1c\u4e1c\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u5f88\u591a\u53c2\u6570\uff0c\u8ba9\u4f60\u7684\u7a0b\u5e8f\u968f\u5fc3\u6240\u6b32\u7684\u81ea\u52a8\u8fd0\u884c\u3002\u5728\u63a7\u5236\u9762\u677f\u91cc\u53ef\u4ee5\u627e\u5230\u4efb\u52a1\u8ba1\u5212\uff0c\u70b9\u51fb\u65b0\u5efa\u4efb\u52a1\u5c31OK\u4e86\u3002

\u521a\u521a\u65e0\u610f\u770b\u5230\u7684\uff0c\u7adf\u7136\u662f\u8fd9\u6837\u7684\uff0c\u6211\u4e5f\u6ca1\u60f3\u5230\uff0c\u5475\u5475\u3002\u4e0a\u9762\u7684\u56de\u7b54\u4f5c\u5e9f\u5566~~~~~~~

\u5728\u201c\u5f00\u59cb\u2192\u8fd0\u884c\u201d\u4e2d\u952e\u5165\u201cregedit\uff0eexe\u201d\uff0c\u6253\u5f00\u201c\u6ce8\u518c\u8868\u7f16\u8f91\u5668\u201d\uff0c\u5c55\u5f00\u5206\u652f\u201cHKEY\uff3fLOCAL\uff3fMACHINE\uff3cSYSTEM\uff3cCurrentControlSet\uff3cServices\u201d\uff0c\u5728\u53f3\u4fa7\u7a97\u683c\u4e2d\u663e\u793a\u7684\u5c31\u662f\u672c\u673a\u5b89\u88c5\u7684\u670d\u52a1\u9879\u3002
\u5982\u679c\u8981\u65b0\u5efa\u670d\u52a1\uff0c\u53ea\u987b\u70b9\u51fb\u201c\u7f16\u8f91\u2192\u65b0\u5efa\u2192\u9879\u201d\uff0c\u7136\u540e\u4e3a\u6b64\u9879\u547d\u540d\uff0c\u5982\u201ctest\u201d\uff1b\u7136\u540e\u53f3\u51fb\u8be5\u9879\uff0c\u9009\u62e9\u201c\u65b0\u5efa\u2192\u5b57\u7b26\u4e32\u503c\u201d\u6216\u201c\u65b0\u5efa\u2192DWORD\u503c\u201d\u5373\u53ef\u3002\u6dfb\u52a0\u4e00\u4e2a\u670d\u52a1\u9879\u76ee\u5177\u4f53\u9700\u8981\u6dfb\u52a0\u7684\u952e\u503c\u5982\u4e0b\uff1a
\u201cDisplayName\u201d\uff0c\u5b57\u7b26\u4e32\u503c\uff0c\u5bf9\u5e94\u670d\u52a1\u540d\u79f0\uff1b
\u201cDescription\u201d\uff0c\u5b57\u7b26\u4e32\u503c\uff0c\u5bf9\u5e94\u670d\u52a1\u63cf\u8ff0\uff1b
\u201cImagePath\u201d\uff0c\u5b57\u7b26\u4e32\u503c\uff0c\u5bf9\u5e94\u8be5\u670d\u52a1\u7a0b\u5e8f\u6240\u5728\u7684\u8def\u5f84\uff1b
\u201cObjectName\u201d\uff0c\u5b57\u7b26\u4e32\u503c\uff0c\u503c\u4e3a\u201cLocalSystem\u201d\uff0c\u8868\u793a\u672c\u5730\u767b\u5f55\uff1b
\u201cErrorControl\u201d\uff0cDWORD\u503c\uff0c\u503c\u4e3a\u201c1\u201d\uff1b
\u201cStart\u201d\uff0cDWORD\u503c\uff0c\u503c\u4e3a2\u8868\u793a\u81ea\u52a8\u8fd0\u884c\uff0c\u503c\u4e3a3\u8868\u793a\u624b\u52a8\u8fd0\u884c\uff0c\u503c\u4e3a4\u8868\u793a\u7981\u6b62\uff1b
\u201cType\u201d\uff0cDWORD\u503c\uff0c\u5e94\u7528\u7a0b\u5e8f\u5bf9\u5e9410\uff0c\u5176\u5b83\u5bf9\u5e9420\u3002
\u53e6\u5916\uff0c\u8fd8\u8981\u5728\u201ctest\u201d\u9879\u4e0b\u65b0\u5efa\u4e00\u4e2a\u201cEnum\u201d\u9879\u3002\u6309\u7167\u4ee5\u4e0a\u6b65\u9aa4\u6dfb\u52a0QQ\u7a0b\u5e8f\u4e3a\u670d\u52a1\uff0c\u91cd\u65b0\u542f\u52a8\u8ba1\u7b97\u673a\u540e\uff0c\u6253\u5f00\u201c\u670d\u52a1\u201d\u7a97\u53e3\uff0c\u5c31\u53ef\u4ee5\u770b\u5230\u521a\u624d\u6dfb\u52a0\u7684QQ\u670d\u52a1\u3002
\u5982\u679c\u8981\u5220\u9664\u67d0\u9879\u670d\u52a1\uff0c\u53ea\u8981\u5220\u9664\u6ce8\u518c\u8868\u7684\u4e2d\u76f8\u5173\u952e\u503c\u5373\u53ef\uff0c\u672c\u4f8b\u4e2d\u8981\u5220\u9664QQ\u670d\u52a1\uff0c\u76f4\u63a5\u5220\u9664\u201cHKEY\uff3fLOCAL\uff3fMACHINE\uff3cSYSTEM\uff3cCurrentControlSet\uff3cServices\uff3ctest\u201d\u5206\u652f\u5373\u53ef\u3002

---- Windows NT与Windows 9x有一个非常重要的区别,即Windows
NT提供了很多功能强大的Service(服务)。这些Service可以随着NT的启动而自启动,也可以让用户通过控制面板启动,还可以被Win32应用程序起停。甚至在没有用户登录系统的情况下,这些Service也能执行。许多FTP、WWW服务器和数据库就是以Service的形式存在于NT上,从而实现了无人值守。就连最新版的“黑客”程序BackOrifice 2000也是以Service形式在NT上藏身的。由于Service的编程较复杂,许多开发者想开发自己的Service但往往都望而却步。鉴于此,下面我们就从头到尾来构造一个全新的Service,读者只要在程序中注明的地方加上自己的代码,那么就可以轻松拥有一个自己的Service。在编写Service之前,先介绍一下几个重要的函数:

---- 1. SC_HANDLE OpenSCManager( LPCTSTR lpMachineName,
LPCTSTR lpDatabaseName, DWORD dwDesiredAccess)

---- OpenSCManager 函数打开指定计算机上的service control
manager database。其中参数lpMachineName指定计算机名,若为空则指定为本机。LpDatabaseName为指定要打开的service
control manager database名, 默认为空。dwDesiredAccess指定操作的权限, 可以为下面取值之一:

---- SC_MANAGER_ALL_ACCESS file://所有权限

---- SC_MANAGER_CONNECT file://允许连接到service control
manager database

---- SC_MANAGER_CREATE_SERVICE file://允许创建服务对象并把它加入database

---- SC_MANAGER_ENUMERATE_SERVICE file://允许枚举database
中的Service

---- SC_MANAGER_LOCK file://允许锁住database

---- SC_MANAGER_QUERY_LOCK_STATUS file://允许查询database的封锁信息

---- 函数执行成功则返回一个指向service control manager
database的句柄,失败则返回NULL。注意:WINNT通过一个名为service control manager database的数据库来管理所有的Service,因此对Service的任何操作都应打开此数据库。

---- 2. SC_HANDLE CreateService(SC_HANDLE
hSCManager,
LPCTSTR lpServiceName,
LPCTSTR lpDisplayName,
DWORD dwDesiredAccess,
DWORD dwServiceType,
DWORD dwStartType,
DWORD dwErrorControl,
LPCTSTR lpBinaryPathName,
LPCTSTR lpLoadOrderGroup,
LPDWORD lpdwTagId,
LPCTSTR lpDependencies,
LPCTSTR lpServiceStartName,
LPCTSTR lpPassword)

---- CreatService函数产生一个新的SERVICE。其中参数hSCManager为指向service
control manager database 的句柄,由OpenSCManager返回。LpServiceName为SERVICE的名字,lpDisplayName为Service显示用名,dwDesiredAccess是访问权限,本程序中用SERVICE_ALL_ACCESS。wServiceType,指明SERVICE类型,本程序中用SERVICE_WIN32_OWN_PROCESS|
SERVICE_INTERACTIVE_PROCESS。dwStartType为Service启动方式,本程序采用自启动,即dwStartType等于SERVICE_AUTO_START。
dwErrorControl说明当Service在启动中出错时采取什么动作,本程序采用SERVICE_ERROR_IGNORE即忽约错误,读者可以改为其他的。LpBinaryPathName指明Service本体程序的路径名。剩下的五个参数一般可设为NULL。如函数调用成功则返回这个新Service的句柄,失败则返回NULL。与此函数对应的是DeleteService(
hService),它删除指定的Service。

---- 3. SC_HANDLE OpenService(SC_HANDLE hSCManager,LPCTSTR
lpServiceName, DWORD dwDesiredAccess )

---- OpenService函数打开指定的Service。其中参数hSCManager为指向service
control manager database 的句柄,由OpenSCManager返回。LpServiceName为Service的名字,dwDesiredAccess是访问权限,其可选值比较多,读者可以参看SDK
Help. 函数调用成功则返回打开的Service句柄,失败则返回NULL。

---- 4. BOOL StartService( SC_HANDLE hService,
DWORD dwNumServiceArgs,LPCTSTR *lpServiceArgVectors )

---- StartService函数启动指定的Service。其中参数hService
为指向Service的句柄,由OpenService返回。dwNumServiceAr为启动服务所需的参数的个数。lpszServiceArgs
为 启 动 服务所需的参数。函数执行成功则返回True, 失败则返回False。

---- 5. BOOL ControlService(SC_HANDLE hService
DWORD dwControl,LPSERVICE_STATUS lpServiceStatus )

---- Service程序没有专门的停止函数,而是用ControlService函数来控制Service的暂停、继续、停止等操作。参数dwControl指定发出的控制命令,可以为以下几个值:
SERVICE_CONTROL_STOP file://停止Service
SERVICE_CONTROL_PAUSE file://暂停Service
SERVICE_CONTROL_CONTINUE file://继续Service
SERVICE_CONTROL_INTERROGATE file://查询Service的状态
SERVICE_CONTROL_SHUTDOWN file://让ControlService调用失效

---- 参数lpServiceStatus是一个指向SERVICE_STATUS的指针。SERVICE_STATUS是一个比较重要的结构,它包含了Service的各种信息,如当前状态、可接受何种控制命令等等。

---- 6. BOOL QueryServiceStatus( SC_HANDLE
hService,LPSERVICE_STATUS lpServiceStatus )

---- QueryServiceStatus函数比较简单,它查询并返回当前Service的状态。

---- 编制一个Service一般需要两个程序,一个是Service本体,一个是用于对Service进行控制的控制程序。通常Service本体是一个console程序,而控制程序则是一个普通的Win32应用程序(当然,用户不用控制程序而通过控制面板也可对Service进行启、停,但不能进行添加、删除操作。)

---- 首先,我们来编写Service本体。对于Service本体来说,它一般又由以下三部分组成:main()、ServiceMain()、Handler(),下面是main()的源代码:(注:由于篇幅的关系,大部分程序都没进行错误处理,读者可以自己添上)

int main(int argc, char **argv)
{
SERVICE_TABLE_ENTRY ste[2]; //一个Service进程可以有多个线程,这是每个线程的入口表
ste[0].lpServiceName="W.Z.SERVICE"; //线程名字
ste[0].lpServiceProc=ServiceMain; //线程入口地址
ste[1].lpServiceName=NULL; //最后一个必须为NULL
ste[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ste);
return 0;
}

---- main()是Service的主线程。当servie control manager开始一个Service进程时,它总是等待这个Service去调用StartServiceCtrlDispatcher()函数。main(
)作为这个进程的主线程应该在程序开始后尽快调用StartServiceCtrlDispatcher()。StartServiceCtrlDispatcher()在被调用后并不立即返回,它把本Service的主线程连接到service
control manager,从而让service control manager通过这个连接发送开始、停止等控制命令给主线程。主线程在这时就扮演了一个命令的转发器的角色,它或者调用Handle(
)去处理停止、继续等控制要求,或者产生一个新线程去执行ServiceMain。StartServiceCtrlDispatcher()在整个Service结束时才返回。

---- ServiceMain()是Service真正的入口点,必须在main()中进行了正确的定义。ServiceMain(
)的两个参数是由StartService()传递过来的。下面是ServiceMain()的源代码:
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
ssh=RegisterServiceCtrlHandler
("W.Z.SERVICE",Handler);
ss.dwServiceType=SERVICE_WIN32_OWN
_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_START_PENDING;
file://如用户程序的代码比较多
(执行时间超过1秒),这儿要设成SERVICE_
START_PENDING,待用户程序完成后再设为SERVICE_RUNNING。
ss.dwControlsAccepted=SERVICE_ACCEPT_
STOP;//表明Service目前能接受的命令是停止命令。
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh, &ss);
file://必须随时更新数据库中Service的状态。
Mycode(); file://这儿可放入用户自己的代码
ss.dwServiceType=SERVICE_WIN32_OWN_
PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_RUNNING;
ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);
Mycode();// 这儿也可放入用户自己的代码
}
在ServiceMain()中应该立即调用
RegisterServiceCtrlHandler()注册一个Handler
去处理控制程序或控制面板对Service的控制要求。
Handler()被转发器调用去处理要求,
下面是Handler()的源代码:
void WINAPI Handler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP: file://停止Service
Mycode();//这儿可放入用户自己的相关代码
ss.dwWin32ExitCode = 0;
ss.dwCurrentState =SERVICE_STOPPED;
file://把Service的当前状态置为STOP
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus (ssh,&ss);
/必须随时更新数据库中Service的状态
break;
case SERVICE_CONTROL_INTERROGATE:
SetServiceStatus (ssh,&ss);
/必须随时更新数据库中Service的状态
break;
}
}

---- 好了,Service本体程序已基本完成,我们接着来看一下Service的控制程序:

---- 控制程序是一个标准的window程序,上面主要有四个按纽:Create Service、Delete
Service、start、stop,分别用来产生、删除、开始和停止Service。下面是它们的部分源代码:
1. 产生Service
void __fastcall TForm1::CreateBtnClick
(TObject *Sender)
{
scm=OpenSCManager(NULL,NULL,
SC_MANAGER_CREATE_SERVICE);
if (scm!=NULL){
svc=CreateService(scm,
"W.Z.SERVICE","W.Z.SERVICE",//Service名字
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS
|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START,
file://以自动方式开始
SERVICE_ERROR_IGNORE,
"C:\\ntservice.exe", file://Service本体程序路径,
必须与具体位置相符
NULL,NULL,NULL,NULL,NULL);
if (svc!=NULL)
CloseServiceHandle(svc);
CloseServiceHandle(scm);
}
}
2. 删除Service
void __fastcall TForm1::DeleteBtnClick
(TObject *Sender)
{
scm=OpenSCManager(NULL,NULL,
SC_MANAGER_CONNECT);
if (scm!=NULL){
svc=OpenService(scm,"W.Z.SERVICE",
SERVICE_ALL_ACCESS);
if (svc!=NULL){
QueryServiceStatus(svc,&ServiceStatus);
if (ServiceStatus.dwCurrentState==
SERVICE_RUNNING)//删除前,先停止此Service.
ControlService(svc,
SERVICE_CONTROL_STOP,&ServiceStatus);
DeleteService(svc);
CloseServiceHandle(svc);
file://删除Service后,最好再调用CloseServiceHandle
}
file://以便立即从数据库中移走此条目。
CloseServiceHandle(scm);
}
}
3. 开始Service
void __fastcall TForm1::StartBtnClick(TObject *Sender)
{
scm=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);

if (scm!=NULL){
svc=OpenService(scm,"W.Z.SERVICE",SERVICE_START);
if (svc!=NULL){
StartService(svc,0,NULL);//开始Service
CloseServiceHandle(svc);
}
CloseServiceHandle(scm);
}
}
4.停止Service
void __fastcall TForm1::StopBtnClick
(TObject *Sender)
{
scm=OpenSCManager(NULL,NULL,
SC_MANAGER_ALL_ACCESS);
if (scm!=NULL){
svc=OpenService(scm,"W.Z.SERVICE",
SERVICE_STOP|SERVICE_QUERY_STATUS);
if (svc!=NULL){
QueryServiceStatus(svc,&ServiceStatus);
if (ServiceStatus.dwCurrentState==
SERVICE_RUNNING)
ControlService(svc,
SERVICE_CONTROL_STOP,&ServiceStatus);
CloseServiceHandle(svc);
}
CloseServiceHandle(scm);
}
}

---- 本程序在C++Builder 和Windows NT 4.0下编译通过。

我也想知道,在这里等答案。。

利用Windows API做成自己启动的,具体怎么实现不太清楚

  • 濡備綍涓虹▼搴娣诲姞绯荤粺鏈嶅姟?
    绛旓細杩愯Regedit鎵撳紑娉ㄥ唽琛ㄧ紪杈戝櫒锛屽湪HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services涓嬶紝鎵惧埌鍒氭墠娣诲姞鐨凮nceMQServer锛岀偣鍑诲彸閿紝鏂板缓涓涓敭锛屽懡鍚嶄负鈥淧arameters鈥濓紝鐐瑰嚮鏂板缓鐨凱arameters锛屽苟鍐嶆鏂板缓涓涓悕绉颁负鈥淎pplication鈥濈殑瀛愰敭锛屾暟鎹被鍨嬩负鈥淩EG_SZ鈥濓紝鏁板间负甯屾湜浣滀负鏈嶅姟杩愯鐨绋嬪簭鐨勬墍鍦ㄤ綅缃紝濡傛灉浣...
  • 濡備綍鎶婄▼搴鍙樻垚鏈嶅姟鍦ㄥ惎鍔ㄦ椂杩愯?
    绛旓細寮鏈烘椂涔熶細鍚姩浜嗐涓鑸殑绋嬪簭涓嶈兘鐩存帴浣滀负绯荤粺鏈嶅姟鍚姩锛屽洜涓轰竴鑸殑绋嬪簭涓己涔忎笌绯荤粺鏈嶅姟绠$悊鍣ㄤ氦浜掔殑鎺ュ彛銆傛垜寤鸿杩樻槸鍙互鎶婄▼搴忔斁鍦ㄦ敞鍐岃〃涓 Run 瀛愰敭閲銆
  • 鎬庝箞鎶婄▼搴忎綔涓烘湇鍔℃潵杩愯?
    绛旓細dwStartType涓篠ervice鍚姩鏂瑰紡,鏈绋嬪簭閲囩敤鑷惎鍔,鍗砫wStartType绛変簬SERVICE_AUTO_START銆 dwErrorControl璇存槑褰揝ervice鍦ㄥ惎鍔ㄤ腑鍑洪敊鏃堕噰鍙栦粈涔堝姩浣,鏈▼搴忛噰鐢⊿ERVICE_ERROR_IGNORE鍗冲拷绾﹂敊璇,璇昏呭彲浠ユ敼涓哄叾浠栫殑銆侺pBinaryPathName鎸囨槑Service鏈綋绋嬪簭鐨勮矾寰勫悕銆傚墿涓嬬殑浜斾釜鍙傛暟涓鑸彲璁句负NULL銆傚鍑芥暟璋冪敤鎴愬姛鍒欒繑鍥炶繖涓柊Ser...
  • 鎬庝箞鍚姩鎵撳嵃鍚庡彴绋嬪簭鏈嶅姟杩愯?
    绛旓細1銆佸湪鐢佃剳妗岄潰宸︿笅瑙掑崟鍑汇愬紑濮嬨戝浘鏍囷紝鐒跺悗閫夋嫨銆愭帶鍒堕潰鏉裤2銆佸湪鎺у埗闈㈡澘绐楀彛涓崟鍑绘墦寮銆愮郴缁熷拰瀹夊叏銆3銆佹壘鍒般愮鐞嗗伐鍏枫戠劧鍚庡崟鍑昏繘鍏ョ鐞嗙洰褰 4銆佸湪鐩綍涓壘鍒般鏈嶅姟銆戝弻鍑绘墦寮銆5銆佸湪鏈嶅姟鐩綍涓壘鍒般恜rint spooler銆戯紝鐒跺悗鍗曞嚮鍙抽敭閫夋嫨銆愬惎鍔ㄣ戝嵆鍙
  • 濡備綍鎶涓涓狫ava绋嬪簭鍋氭垚Windows鏈嶅姟
    绛旓細1銆佷笅杞絯rapper-windows-x86-32绯诲垪鐨勫伐鍏峰寘锛岃В鍘嬬缉涓<wrapper-home>銆2銆佹柊寤轰竴涓洰褰曪紝渚嬪锛欳锛歕MyServerApp,骞跺湪鍏朵笅闈㈠垱寤轰簲涓枃浠跺す 鍒嗗埆涓猴細bin 鍙墽琛绋嬪簭鏂囦欢澶 conf 閰嶇疆鏂囦欢澶 lib wrapper鑷韩鐨刯ar鍖呮枃浠跺す logs 鏃ュ織鏂囦欢澶瑰寘 application 鏂板缓涓涓猚lass鐢ㄤ簬瀛樻斁搴旂敤绋嬪簭鐨刢lass鏂囦欢锛 姝...
  • Windows 7鏃楄埌鐗堢郴缁熶笅鎬庝箞鎶exe鏂囦欢娉ㄥ唽鎴愮郴缁鏈嶅姟
    绛旓細1銆侀鍏堝埌缃戜笂涓嬭浇鈥渋nstsrv.exe鈥濆伐鍏风敤浜庣郴缁熷畨瑁呭拰鍒犻櫎鏈嶅姟锛岀劧鍚庝笅杞解渟rvany.exe鈥濓紝鍙灏嗙▼搴浠ユ湇鍔$殑鏂瑰紡杩愯锛2銆佸皢杩欎袱涓皬宸ュ叿瀛樻斁浜庡悓纾佺洏鐩綍涓紝姣斿瀛樻斁浜嶥鐩樼洰褰曚腑锛3銆佺劧鍚庡湪閿洏涓婃寜鈥淲in+R鈥濇墦寮鈥滆繍琛屸濈獥鍙o紝杈撳叆鈥渃md鈥濆懡浠ゅ悗鎸夊洖杞﹂敭锛岃繘鍏ュ埌鍛戒护鎻愮ず绗︾獥鍙o紱4銆佸湪鎵撳紑鐨勫懡浠ゆ彁绀...
  • 鎬庝箞鐭ラ亾閭d簺鏈嶅姟鍜屽惎鍔ㄦ槸鐢佃剳绯荤粺杩愯蹇呴』鐨?閭d簺鏄浣欑殑?銆傘(绗旇 ...
    绛旓細涓銆杩愯Msconfig 1.Windows 9X/Me/XP 鍦╓indows 9X/Me/XP绯荤粺涓紝鍙互鍗曞嚮鈥滃紑濮嬧啋杩愯鈥濓紝鍦ㄨ繍琛屾涓緭鍏モ淢sconfig鈥,纭畾杩愯锛屽湪鎵撳紑鐨勭郴缁熼厤缃疄鐢绋嬪簭绐椾腑閫夋嫨鈥滃惎鍔ㄢ濇爣绛撅紝姝ゆ椂渚垮彲鐪嬪埌寰堝鐨勫惎鍔ㄩ」鐩2.Windows 2000 鑰屽湪Windows 2000杩欎釜鍔熻兘琚姝簡锛屼絾鎴戜滑鍙互閫氳繃鈥滃熺敤鈥濈殑鎵嬫鎶奧indows...
  • win7濡備綍杩愯asp绋嬪簭asp绋嬪簭鎬庝箞杩愯
    绛旓細1.棣栧厛闇瑕佸尮閰杩愯鐜銆傝繍琛孉SP鏂囦欢闇瑕佺殑鏈嶅姟鍣ㄦ槸IIS鏈嶅姟鍣,鎵浠ユ垜浠繀椤诲畨瑁呭拰閰嶇疆IIS鏈嶅姟鍣ㄣ傚叾瀹炵浉姣斿叾浠栨湇鍔″櫒,IIS瑕佺畝鍗曞緢澶,鍥犱负鑷甫windows,瀹夎蹇呰鐨勭粍浠跺氨琛屼簡銆 2.浜嗚В涔嬪悗鍐嶆潵瑁匢IS鍚с傞鍏堟墦寮鎺у埗闈㈡澘(鎴戠敤windows2003浣滀负鎿嶄綔绯荤粺,寰堝缃戠珯閮界敤瀹冧綔涓洪粯璁ゆ湇鍔″櫒,鎵浠ユ垜浠ユ涓轰緥),鎵惧埌娣诲姞鎴栧垹闄绋嬪簭...
  • 鎬庝箞璁╀竴涓绋嬪簭浠鏈嶅姟鐨勫舰寮杩愯?(鐢╒S2005C++鍐欑殑,涓嶈兘鐢ㄥ叾瀹冭蒋浠...
    绛旓細鎬庝箞璇村憿锛岀敤浠涔堝伐鍏峰啓鐨勬槸鏃犲叧鐨勫摝銆備綘鍛紝鍘荤湅鐪婱SDN灏辩煡閬撲簡銆
  • 涓涓绋嬪簭娌℃湁鏈嶅姟鍣ㄧ鍙互杩愯鍚?
    绛旓細涓涓绋嬪簭娌℃湁鏈嶅姟鍣ㄧ鍙互杩愯銆傞櫎闈炰綘鐨勮蒋浠朵腑鍚湁璁块棶鏈嶅姟鍣ㄧ殑妯″潡 涓鑸珻銆丆++鐢熸垚exe鏂囦欢澶嶅埗鍒颁换浣曟満鍣ㄩ兘鑳借繍琛岀殑 C#闇瑕佸湪瀹夎.Net鐨勬満鍣ㄤ笂杩愯锛屾病鏈夌殑璇濆畨瑁呬竴涓嵆鍙 鐩稿簲鐨凧ava闇瑕丣ava铏氭嫙鏈 鎵嬫満涓婄殑杞欢闇瑕佽繘琛岀壒娈婄殑缂栧啓锛屽JavaME鏄笓闂ㄧ敤浜庣紪鍐欐墜鏈鸿蒋浠剁殑銆侸ava缂栧啓鐨勭▼搴忓ぇ閮ㄥ垎鐨勬墜鏈轰笂閮...
  • 扩展阅读:让一个app一直保持运行 ... 餐饮工作流程五个步骤 ... 怎么设置后台永久运行 ... 怎样让软件在前台运行 ... 如何把售后服务做好 ... ip程序服务未运行 ... 帮助程序服务未运行 ... 怎么关掉运行的程序 ... 打印机程序服务没有运行 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网