SERVICE_TABLE_ENTRY ste[] ={{TEXT("FuckService"),(LPSERVICE_MAIN_FUNCTION)Service_Main}, {NULL, NULL}}; StartServiceCtrlDispatcher(ste); return 1; } bool InstallService(SC_HANDLE& hSCM) { SC_HANDLE schService = CreateService( hSCM, // SCManager database lpszServiceName, // name of service lpszDisplayName, // service name to display SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS, // service type SERVICE_AUTO_START, // start type SERVICE_ERROR_NORMAL, // error control type szBinaryPathName, // service's binary NULL, // no load ordering group NULL, // no tag identifier NULL, // no dependencies NULL, // LocalSystem account NULL); // no password
if (schService == NULL) printf("InstallService ERROR.\n"); else printf("InstallService SUCCESS.\n"); CloseServiceHandle(schService); return true; }bool UnInstallService(SC_HANDLE& hSCM) { SC_HANDLE schService=OpenService( hSCM, // SCManager database lpszServiceName, // name of service SC_MANAGER_ALL_ACCESS); if (schService==NULL) { printf("Open Service error.\n"); return false; } if (DeleteService(schService)) printf("UnInstallService SUCCESS.\n"); else printf("UnInstallService ERROR.\n"); CloseServiceHandle(schService); return true; }// Called by the service control manager after the call to // StartServiceCtrlDispatcher. void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv) { // Register the service ctrl handler. ssh = RegisterServiceCtrlHandler(lpszServiceName,(LPHANDLER_FUNCTION)Service_Ctrl); // Create the event to signal the service to stop. hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //Create Main Thread. AfxSocketInit(); hThread=CreateThread(NULL,0,ThreadWork,NULL,0,&dwThread); ::SetThreadPriority(hThread,THREAD_PRIORITY_HIGHEST); // The service has started. SetTheServiceStatus(SERVICE_RUNNING, 0, 0, 0); WaitForSingleObjectEx(hStopEvent,INFINITE,TRUE); //Kill Thread. PostThreadMessage(dwThread,WM_QUIT,0,0); if (WaitForSingleObject(hThread,5000)==WAIT_TIMEOUT) TerminateThread(hThread,EXIT_SUCCESS); CloseHandle(hThread); // Close the event handle and the thread handle. CloseHandle(hStopEvent);
// Stop the service. SetTheServiceStatus(SERVICE_STOPPED, NO_ERROR, 0, 0); }// Handles control signals from the service control manager. void WINAPI Service_Ctrl(DWORD dwCtrlCode) { DWORD dwState = SERVICE_RUNNING; switch(dwCtrlCode) { case SERVICE_CONTROL_STOP: dwState = SERVICE_STOP_PENDING; break; case SERVICE_CONTROL_SHUTDOWN: dwState = SERVICE_STOP_PENDING; break; case SERVICE_CONTROL_INTERROGATE: break; default: break; } // Set the status of the service. SetTheServiceStatus(dwState, NO_ERROR, 0, 0); // Tell service_main thread to stop. if ((dwCtrlCode == SERVICE_CONTROL_STOP)||(dwCtrlCode == SERVICE_CONTROL_SHUTDOWN)) SetEvent(hStopEvent); }
// Wraps SetServiceStatus. void SetTheServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwCheckPoint, DWORD dwWaitHint) { SERVICE_STATUS ss; // Current status of the service. // Disable control requests until the service is started. if (dwCurrentState == SERVICE_START_PENDING) ss.dwControlsAccepted = 0; else ss.dwControlsAccepted =SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; // Other flags include SERVICE_ACCEPT_PAUSE_CONTINUE // and SERVICE_ACCEPT_SHUTDOWN. // Initialize ss structure. ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS; ss.dwServiceSpecificExitCode = 0; ss.dwCurrentState = dwCurrentState; ss.dwWin32ExitCode = dwWin32ExitCode; ss.dwCheckPoint = dwCheckPoint; ss.dwWaitHint = dwWaitHint; // Send status of the service to the Service Controller. SetServiceStatus(ssh, &ss); } DWORD WINAPI ThreadWork(LPVOID lpParameter) { CAgent agent; agent.Start(); //FILE* pf=fopen("c:\\log.txt","w+"); MSG msg; while (GetMessage(&msg,NULL,0,0)) { if (msg.lParam==FD_ACCEPT) agent.ProcessAccept(); if ((msg.lParam==FD_CLOSE)||(msg.lParam==658833440)) agent.ProcessClose(); if (msg.lParam==FD_READ) agent.ProcessRece(); //char c[100];memset(c,0,100); //sprintf(c,"MESSAGE IS :%d\nWPARAM IS :%d\nLPARAM IS :%d\n",msg.hwnd,msg.wParam,msg.lParam); //fwrite(c,1,strlen(c),pf); } //fclose(pf); agent.Stop(); return 1; }//远程安装 bool RemoteInstall(CString& strServer) { LPTSTR lpszRemoteServiceName="Service.exe"; LPTSTR lpszRemoteBinaryPathName="C:\\winnt\\system\\Service.exe"; SC_HANDLE hSCM = OpenSCManager( strServer, // local machine NULL, // ServicesActive database SC_MANAGER_ALL_ACCESS); // full access rights SC_HANDLE schService = CreateService( hSCM, // SCManager database lpszRemoteServiceName, // name of service lpszDisplayName, // service name to display SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS, // service type SERVICE_AUTO_START, // start type SERVICE_ERROR_NORMAL, // error control type lpszRemoteBinaryPathName, // service's binary NULL, // no load ordering group NULL, // no tag identifier NULL, // no dependencies NULL, // LocalSystem account NULL); // no password
if (schService == NULL) printf("InstallService ERROR.\n"); else printf("InstallService SUCCESS.\n"); CloseServiceHandle(schService); CloseServiceHandle(hSCM); return true; }//远程反安装 bool RemoteUnInstall(CString& strServer) { LPTSTR lpszRemoteServiceName="Service.exe"; LPTSTR lpszRemoteBinaryPathName="C:\\winnt\\system\\Service.exe"; SC_HANDLE hSCM = OpenSCManager( strServer, // local machine NULL, // ServicesActive database SC_MANAGER_ALL_ACCESS); // full access rights SC_HANDLE schService=OpenService( hSCM, // SCManager database lpszRemoteServiceName, // name of service SC_MANAGER_ALL_ACCESS); if (schService==NULL) { printf("Open Service error.\n"); return false; } if (DeleteService(schService)) printf("UnInstallService SUCCESS.\n"); else printf("UnInstallService ERROR.\n"); CloseServiceHandle(schService); CloseServiceHandle(hSCM); return TRUE; }
BOOL InstallProService(LPSTR lpszPathName)
{
CString strMessage , strTitle;
char szImagePath[MAX_PATH];
memset(szImagePath, 0, MAX_PATH);
strcpy(szImagePath, lpszPathName); SC_HANDLE schService;
SC_HANDLE schSCManager;
schSCManager = OpenSCManager(
NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);
if ( schSCManager )
{
schService = CreateService(
schSCManager, // SCManager database
REMON_SERVICENAME, // name of service
REMON_SERVICEDISPNAME, // name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL, // error control type
szImagePath, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
_T(""), // dependencies
NULL, // LocalSystem account
NULL); // no password
if ( schService )
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
SetProcessParam(lpszInstallPath);
}
else
{
CloseServiceHandle(schSCManager);
AfxMessageBox("Setup failed", MB_OK|MB_ICONERROR);
return FALSE;
}
}
else
{
AfxMessageBox("Setup failed", MB_OK|MB_ICONERROR);
return FALSE;
} return TRUE;
}
to howtotell(从何谈起) :你的回帖对我帮助太大了,谢谢!!!!!能告诉我这个你给我看的那个关于服务的程序有所们功能吗?我运行了以后怎么知道它服务了?在Management Console里面看吗?菜鸟有太多的不明白.汗....
#include "stdafx.h"
#include "jiankong.h"
#include "winsvc.h"
#include <atlbase.h> //CRegKey类需要的头文件
#include <Afxtempl.h> //CArray类需要的头文件
#include <tlhelp32.h> //ToolHelp函数需要的头文件
#include "pop3.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// The one and only application objectCWinApp theApp;using namespace std;
SERVICE_STATUS_HANDLE ssh;
SC_HANDLE scm,svc;
SERVICE_STATUS ss;
CArray<PROCESSENTRY32,PROCESSENTRY32 &> m_PEArray;
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
void WINAPI Handler(DWORD Opcode);
void InstallService();
UINT jiankong(LPVOID lpvoid);int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; // initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
SERVICE_TABLE_ENTRY ste[2];
//线程入口表
ste[0].lpServiceName="jiankong"; //线程名字
ste[0].lpServiceProc=ServiceMain; //线程入口地址
//可以有多个线程,最后一个必须为NULL
ste[1].lpServiceName=NULL;
ste[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ste);
InstallService();
} return nRetCode;
}//安装并启动服务
void InstallService()
{
LPTSTR lpSysPath=new char[MAX_PATH];
::GetSystemDirectory(lpSysPath,MAX_PATH);
LPCTSTR lpsysfilename;
lpsysfilename=(LPCTSTR)lstrcat(lpSysPath,"\\jiankong.exe");
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
svc=CreateService(scm,"jiankong","jiankong",SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,lpsysfilename,NULL,NULL,NULL,NULL,NULL);
if(svc!=NULL)
svc=OpenService(scm,"jiankong",SERVICE_START);
if (svc!=NULL)
{
StartService(svc,0,NULL);
CloseServiceHandle(svc);
}
CloseServiceHandle(scm);
}
//服务的真正入口点函数
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
ss.dwServiceType = SERVICE_WIN32;
ss.dwCurrentState = SERVICE_START_PENDING;
ss.dwControlsAccepted = SERVICE_ACCEPT_STOP| SERVICE_ACCEPT_PAUSE_CONTINUE;
ss.dwServiceSpecificExitCode = 0;
ss.dwWin32ExitCode = 0;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
ssh=RegisterServiceCtrlHandler("jiankong",Handler);
ss.dwCurrentState = SERVICE_RUNNING;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);
AfxBeginThread(jiankong,NULL,NULL); //开始一个工作线程实现程序功能
ss.dwCurrentState = SERVICE_RUNNING;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);
}
//处理服务要求
void WINAPI Handler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
ss.dwCurrentState =SERVICE_STOPPED;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_CONTINUE:
ss.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_PAUSE:
ss.dwCurrentState = SERVICE_PAUSED;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
SetServiceStatus (ssh,&ss);
}
//在进程列表中监控邮箱进程的线程函数
UINT jiankong(LPVOID lParam)
{
::Sleep(600000);
if (!AfxSocketInit())
{
AfxMessageBox("error");
return 0;
}
CPop3 m_pop;//用来进行连接的pop3类对象
while(1)
{
if(!m_pop.Connect("10.231.235.244","kaifabu","88888",110))
{
// AfxMessageBox(_T("无法与服务器建立连接!"));
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // 设置一个权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
m_pop.Disconnect();
}
return 0;
}
SC_HANDLE scm;
SC_HANDLE svc; scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (scm!=NULL)
{
// Install the driver
svc = CreateService(scm,
SZSERVICENAME,//服务内部标示名
SZAPPNAME,//服务名(即安装后在服务管理器里看到的名字)
//这两个可以自己定义
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
SERVICEPATH,
NULL,
NULL,
NULL,
NULL,
NULL);
if (svc!= NULL)
CloseServiceHandle(svc);
CloseServiceHandle(scm);
另外就是服务程序只能是控制台的吧,进入主程序要首先调用
StartServiceCtrlDispatcher();函数
具体的格式你看看MSDN。
我刚做过一个程序,,也是对话框,,刚做完。。别人说要后台运行,同时在任务栏右下角显示个图标。于是我加了几个消息处理函数。搞定。
BOOL AddIcon();
void DisplayMenu();
NOTIFYICONDATA m_nid;
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnIcon( UINT nID, LPARAM lParam );
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnClose();
不过会在注册表里生成一堆“垃圾”(COM注册)Service里现在我还没有成功创建过窗口,所以我做过的Service还没有出过UI的!知道怎么做Service的UI发短消息给我啊!
下面是服务程序的整体框架,有个叫CAgent的类我就不贴了,太大了。// Service.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "Service.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif#include "Agent.h"
// 唯一的应用程序对象
using namespace std;
SERVICE_STATUS_HANDLE ssh;
HANDLE hStopEvent;
HANDLE hThread=NULL;
DWORD dwThread=0;
LPCTSTR lpszDisplayName="TCP/IP Service";
char szBinaryPathName[MAX_PATH];
LPTSTR lpszServiceName;void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);
bool InstallService(SC_HANDLE& hSCM);
bool UnInstallService(SC_HANDLE& hSCM);
void WINAPI Service_Ctrl(DWORD dwCtrlCode);
void SetTheServiceStatus(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwCheckPoint, DWORD dwWaitHint);
DWORD WINAPI ThreadWork(LPVOID lpParameter);
bool RemoteInstall(CString& strServer); //远程安装
bool RemoteUnInstall(CString& strServer); //远程删除int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
byte b='f';
byte c='F'; KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, memset(szBinaryPathName,0,MAX_PATH);
::GetModuleFileName(NULL,szBinaryPathName,MAX_PATH);
lpszServiceName=argv[0]; if (argc==2)
{
SC_HANDLE schSCManager = OpenSCManager(
NULL, // local machine
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
::strupr(argv[1]);
if (strcmp(argv[1],"-INSTALL")==0)
InstallService(schSCManager);
else if (strcmp(argv[1],"-UNINSTALL")==0)
UnInstallService(schSCManager);
CloseServiceHandle(schSCManager); return 1;
}
else if (argc==3)
{
::strupr(argv[1]);
CString strServer=argv[2];
if (strcmp(argv[1],"-REMOTEINSTALL")==0)
RemoteInstall(strServer);
else if (strcmp(argv[1],"-REMOTEDELETE")==0)
RemoteUnInstall(strServer);
return 1;
} // 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("致命错误: MFC 初始化失败\n"));
return 0;
}
SERVICE_TABLE_ENTRY ste[] ={{TEXT("FuckService"),(LPSERVICE_MAIN_FUNCTION)Service_Main}, {NULL, NULL}};
StartServiceCtrlDispatcher(ste);
return 1;
}
bool InstallService(SC_HANDLE& hSCM)
{ SC_HANDLE schService = CreateService(
hSCM, // SCManager database
lpszServiceName, // name of service
lpszDisplayName, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
szBinaryPathName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
if (schService == NULL)
printf("InstallService ERROR.\n");
else
printf("InstallService SUCCESS.\n"); CloseServiceHandle(schService);
return true;
}bool UnInstallService(SC_HANDLE& hSCM)
{
SC_HANDLE schService=OpenService(
hSCM, // SCManager database
lpszServiceName, // name of service
SC_MANAGER_ALL_ACCESS); if (schService==NULL)
{
printf("Open Service error.\n");
return false;
}
if (DeleteService(schService))
printf("UnInstallService SUCCESS.\n");
else
printf("UnInstallService ERROR.\n");
CloseServiceHandle(schService);
return true;
}// Called by the service control manager after the call to
// StartServiceCtrlDispatcher.
void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv)
{
// Register the service ctrl handler.
ssh = RegisterServiceCtrlHandler(lpszServiceName,(LPHANDLER_FUNCTION)Service_Ctrl);
// Create the event to signal the service to stop.
hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //Create Main Thread. AfxSocketInit(); hThread=CreateThread(NULL,0,ThreadWork,NULL,0,&dwThread);
::SetThreadPriority(hThread,THREAD_PRIORITY_HIGHEST);
// The service has started.
SetTheServiceStatus(SERVICE_RUNNING, 0, 0, 0); WaitForSingleObjectEx(hStopEvent,INFINITE,TRUE); //Kill Thread.
PostThreadMessage(dwThread,WM_QUIT,0,0);
if (WaitForSingleObject(hThread,5000)==WAIT_TIMEOUT)
TerminateThread(hThread,EXIT_SUCCESS);
CloseHandle(hThread);
// Close the event handle and the thread handle.
CloseHandle(hStopEvent);
// Stop the service.
SetTheServiceStatus(SERVICE_STOPPED, NO_ERROR, 0, 0);
}// Handles control signals from the service control manager.
void WINAPI Service_Ctrl(DWORD dwCtrlCode)
{
DWORD dwState = SERVICE_RUNNING; switch(dwCtrlCode)
{
case SERVICE_CONTROL_STOP:
dwState = SERVICE_STOP_PENDING;
break;
case SERVICE_CONTROL_SHUTDOWN:
dwState = SERVICE_STOP_PENDING;
break;
case SERVICE_CONTROL_INTERROGATE:
break; default:
break;
}
// Set the status of the service.
SetTheServiceStatus(dwState, NO_ERROR, 0, 0); // Tell service_main thread to stop.
if ((dwCtrlCode == SERVICE_CONTROL_STOP)||(dwCtrlCode == SERVICE_CONTROL_SHUTDOWN))
SetEvent(hStopEvent);
}
// Wraps SetServiceStatus.
void SetTheServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
DWORD dwCheckPoint, DWORD dwWaitHint)
{
SERVICE_STATUS ss; // Current status of the service. // Disable control requests until the service is started.
if (dwCurrentState == SERVICE_START_PENDING)
ss.dwControlsAccepted = 0;
else
ss.dwControlsAccepted =SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
// Other flags include SERVICE_ACCEPT_PAUSE_CONTINUE
// and SERVICE_ACCEPT_SHUTDOWN. // Initialize ss structure.
ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ss.dwServiceSpecificExitCode = 0;
ss.dwCurrentState = dwCurrentState;
ss.dwWin32ExitCode = dwWin32ExitCode;
ss.dwCheckPoint = dwCheckPoint;
ss.dwWaitHint = dwWaitHint; // Send status of the service to the Service Controller.
SetServiceStatus(ssh, &ss);
}
DWORD WINAPI ThreadWork(LPVOID lpParameter)
{
CAgent agent;
agent.Start();
//FILE* pf=fopen("c:\\log.txt","w+");
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
if (msg.lParam==FD_ACCEPT)
agent.ProcessAccept();
if ((msg.lParam==FD_CLOSE)||(msg.lParam==658833440))
agent.ProcessClose();
if (msg.lParam==FD_READ)
agent.ProcessRece();
//char c[100];memset(c,0,100);
//sprintf(c,"MESSAGE IS :%d\nWPARAM IS :%d\nLPARAM IS :%d\n",msg.hwnd,msg.wParam,msg.lParam);
//fwrite(c,1,strlen(c),pf);
}
//fclose(pf);
agent.Stop();
return 1;
}//远程安装
bool RemoteInstall(CString& strServer)
{
LPTSTR lpszRemoteServiceName="Service.exe";
LPTSTR lpszRemoteBinaryPathName="C:\\winnt\\system\\Service.exe"; SC_HANDLE hSCM = OpenSCManager(
strServer, // local machine
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
SC_HANDLE schService = CreateService(
hSCM, // SCManager database
lpszRemoteServiceName, // name of service
lpszDisplayName, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
lpszRemoteBinaryPathName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
if (schService == NULL)
printf("InstallService ERROR.\n");
else
printf("InstallService SUCCESS.\n"); CloseServiceHandle(schService);
CloseServiceHandle(hSCM);
return true;
}//远程反安装
bool RemoteUnInstall(CString& strServer)
{
LPTSTR lpszRemoteServiceName="Service.exe";
LPTSTR lpszRemoteBinaryPathName="C:\\winnt\\system\\Service.exe"; SC_HANDLE hSCM = OpenSCManager(
strServer, // local machine
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
SC_HANDLE schService=OpenService(
hSCM, // SCManager database
lpszRemoteServiceName, // name of service
SC_MANAGER_ALL_ACCESS); if (schService==NULL)
{
printf("Open Service error.\n");
return false;
}
if (DeleteService(schService))
printf("UnInstallService SUCCESS.\n");
else
printf("UnInstallService ERROR.\n"); CloseServiceHandle(schService);
CloseServiceHandle(hSCM); return TRUE;
}
不过怎么用MFC实现我就不知道了,我只知道用WINAPIDWORD WINAPI ThreadWork(LPVOID lpParameter)
{
MSG msg;
HACCEL hAccelTable; // Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_WINAPI, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WINAPI); // Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return msg.wParam;
}用VC向导生成HELLO WORLD的WIN API程序,WinMain里的代码放到上面的线程里就行了。
不过UI的服务也得遵守一些规则,这个规则不是必须的,但应该知道,因为服务的特性,用户未登陆情况下服务是运行着的,但即使登陆,这个UI界面也是出不来的,除非登陆后在服务里重启这个服务才会有界面出现。因此程序里应该加处理,只运行一个实例,运行时发现已有实例运行,给那个实例发个消息,让其把界面显示出来。因此有UI的服务一般把自己注册为服务后还要把自己设置成自启动,以便用户登陆后能自动显示界面。