【【【 请问在windows2000下怎么把程序注册成系统服务?谢谢 】】】

lj9852 2002-06-06 12:20:07
我想让程序在2000任务管理器里的应用程序列表里不可见,好像要注册系统服务,请大虾指点,谢谢
...全文
245 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lj9852 2002-06-10
  • 打赏
  • 举报
回复
不好意思,这两天忙着准备毕业答辩了

按你的方法做了,但达不到隐藏的目的阿
tleon 2002-06-07
  • 打赏
  • 举报
回复
很简单的,先用OpenSCManager打开SCM

然后用CreateService创建,代码如下:

SC_HANDLE m_hSCM = NULL; //Handle to the SCM

//打开库
m_hSCM = ::OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE,
SC_MANAGER_ALL_ACCESS);

SC_HANDLE m_hService = NULL;

//取得应用程序名
CString tmp;
GetModuleFileName(NULL, tmp.GetBuffer(1024), 1024);
//创建Service
m_hService = ::CreateService(m_hSCM,
"TESTServive2", //服务启动时名字
"TESTService2", //服务显示的名字
0, //SERVICE_ALL_ACCESS, //访问方式
SERVICE_WIN32_OWN_PROCESS, // 服务类型
SERVICE_AUTO_START, //服务启动方式
SERVICE_ERROR_IGNORE, //出错处理方式
tmp, //程序的全路径名
NULL, //lpLoadOrderGroup,
NULL, // lpdwTagId,
NULL, // lpDependencies,
NULL, // lpServiceStartName,
NULL // lpPassword
);
if (m_hService == NULL)
TRACE(_T("Failed in call to CreateService in Create,
GetLastError:%d\n"), ::GetLastError());


//删除Service
BOOL ret = DeleteService(m_hService/* handle to service*/);

CloseServiceHandle(m_hService);

下面是打开一个Service,然后进行操作,这里只是简单删除
//打开Service
m_hService = OpenService(m_hSCM, "TESTService", DELETE);
//删除
ret = DeleteService(m_hService);
sufeng 2002-06-06
  • 打赏
  • 举报
回复
int (CALLBACK *hide)(DWORD,DWORD);
hide=(int(CALLBACK*)(DWORD,DWORD))GetProcAddress(dll,"RegisterServiceProcess");
hide(NULL,1);
atling 2002-06-06
  • 打赏
  • 举报
回复
还有OpenSCManager SetServiceStatus
等函数都是需要的
lj9852 2002-06-06
  • 打赏
  • 举报
回复
SC_HANDLE在哪里定义
lovage 2002-06-06
  • 打赏
  • 举报
回复
使用 CreateService ,在scm数据库中注册服务


SC_HANDLE CreateService(
SC_HANDLE hSCManager, // handle to SCM database
LPCTSTR lpServiceName, // name of service to start
LPCTSTR lpDisplayName, // display name
DWORD dwDesiredAccess, // type of access to service
DWORD dwServiceType, // type of service
DWORD dwStartType, // when to start service
DWORD dwErrorControl, // severity of service failure
LPCTSTR lpBinaryPathName, // name of binary file
LPCTSTR lpLoadOrderGroup, // name of load ordering group
LPDWORD lpdwTagId, // tag identifier
LPCTSTR lpDependencies, // array of dependency names
LPCTSTR lpServiceStartName, // account name
LPCTSTR lpPassword // account password
);
storein 2002-06-06
  • 打赏
  • 举报
回复
GZ
lgx1916 2002-06-06
  • 打赏
  • 举报
回复
flag
lj9852 2002-06-06
  • 打赏
  • 举报
回复
楼上的,可以说说吗
tleon 2002-06-06
  • 打赏
  • 举报
回复
创建Service成功了,可就是删除不了

//打开Service
m_hService = OpenService(m_hSCM, "TESTService", DELETE);
//删除
ret = DeleteService(m_hService);

为什么??

况且应用程序在[任务管理器]中也看得见,为什么??
secondlf 2002-06-06
  • 打赏
  • 举报
回复
关注
tleon 2002-06-06
  • 打赏
  • 举报
回复
使用了,可惜CreateService总返回NULL,是什么原因?代码如下:SC_HANDLE m_hSCM = NULL; //Handle to the SCM

m_hSCM = ::OpenSCManager(NULL, NULL,
//SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE);

SC_HANDLE m_hService = NULL;

CString tmp;
GetModuleFileName(NULL, tmp.GetBuffer(1024), 1024);
m_hService = ::CreateService(m_hSCM, "TESTServive",
"TESTService",
0, //SERVICE_ALL_ACCESS, //dwDesiredAccess,
SERVICE_WIN32_OWN_PROCESS, // dwServiceType,
SERVICE_AUTO_START, // dwStartType,
SERVICE_ERROR_IGNORE, // dwErrorControl,
tmp, // lpBinaryPathName,
NULL, // lpLoadOrderGroup,
NULL, // lpdwTagId,
NULL, // lpDependencies,
NULL, // lpServiceStartName,
NULL // lpPassword
);


KINGKANG 2002-06-06
  • 打赏
  • 举报
回复
!
lj9852 2002-06-06
  • 打赏
  • 举报
回复
是不是在程序初始化的时候注册服务?
我在APP的初始化里加入以下代码:

void WINAPI CTestApp::InitService()
{
SERVICE_TABLE_ENTRY ste[2];

ste[0].lpServiceName="JIA.JIA.SERVICE";
ste[0].lpServiceProc=ServiceMain;
ste[1].lpServiceName=NULL;
ste[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ste);
InstallService();
}

这里的ServiceMain怎么指定,有什么作用?

还有那个Handler(DWORD Opcode)有什么作用?谢谢
lj9852 2002-06-06
  • 打赏
  • 举报
回复
大家不要光贴代码啊,我想知道原理和过程

freelybird(阿愚)代码好长啊,有这么麻烦吗?从字面上我想只要InitService()、InstallService()、StartupService()、ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)、Handler(DWORD Opcode)就可以把

lovage()和freelybird(阿愚)两位能说说吗,别人也可以
freelybird 2002-06-06
  • 打赏
  • 举报
回复

#include <windows.h>

typedef struct tagSOCKETSTRU{
WORD dwVersion;
DWORD dwFlag;
int addrlen,ret;
WSADATA wsaData;
SOCKET CreateSock,NewSock;
SOCKADDR_IN Sock_in;
fd_set FdRead;
}SOCKETSTRU,*LPSOCKETSTRU;
LPSOCKETSTRU lpSockStru;

SERVICE_STATUS_HANDLE ssh;
SERVICE_STATUS ss;

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void WINAPI StartupService();

void WINAPI WriteLogFile(LPCTSTR szBuff)
{
HANDLE hFile;
DWORD dwWrite;
TCHAR szTemp[MAX_PATH];
SYSTEMTIME systime;

hFile=CreateFile( "C:\\IP_Log.log",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_HIDDEN,
NULL
);

GetSystemTime(&systime);

wsprintf(szTemp,"<<%ld.%ld.%ld.%ld.%ld.%ld--ip: %s>>,",
systime.wYear,
systime.wMonth,
systime.wDay,
systime.wHour+8,
systime.wMinute,
systime.wSecond,
szBuff
);

SetFilePointer(hFile,0,NULL,FILE_END);
WriteFile(hFile,szTemp,lstrlen(szTemp),&dwWrite,0);
CloseHandle(hFile);
}



DWORD WINAPI IPThread(LPVOID lParam)
{

TCHAR szBuf[MAX_PATH];
LPSOCKETSTRU lpSock=(LPSOCKETSTRU)lParam;

while(TRUE)
{
FD_ZERO(&lpSock->FdRead);
FD_SET(lpSock->CreateSock,&lpSock->FdRead);

lpSock->ret=select(0,&lpSock->FdRead,NULL,NULL,NULL);
if(lpSock->ret==SOCKET_ERROR)
{
closesocket(lpSock->CreateSock);
return FALSE;
}

if(FD_ISSET(lpSock->CreateSock,&lpSock->FdRead))
{
lpSock->addrlen=sizeof(SOCKADDR_IN);
lpSock->NewSock=accept(lpSock->CreateSock,(LPSOCKADDR)&lpSock->Sock_in,&lpSock->addrlen);
if(lpSock->NewSock==INVALID_SOCKET)
{
closesocket(lpSock->NewSock);
}
getpeername(lpSock->CreateSock,(LPSOCKADDR)&lpSock->Sock_in,&lpSock->addrlen);
wsprintf(szBuf,"Your IP Address is %s",inet_ntoa(lpSock->Sock_in.sin_addr));
send(lpSock->NewSock,szBuf,lstrlen(szBuf),0);
WriteLogFile(inet_ntoa(lpSock->Sock_in.sin_addr));
}
}

return TRUE;
}

void WINAPI LogIP(LPSOCKETSTRU lpSock,int Port)
{

HANDLE hThread;
DWORD dwTid;

lpSock->dwVersion=MAKEWORD(1,1);
lpSock->dwFlag=TRUE;

if((WSAStartup(lpSock->dwVersion,&lpSock->wsaData))!=0)
{
MessageBox(NULL,"INIT SOCKET ERROR",NULL,MB_OK);
}

lpSock->CreateSock=socket(AF_INET,SOCK_STREAM,0);
if(lpSock->CreateSock==SOCKET_ERROR)
{
closesocket(lpSock->CreateSock);
MessageBox(NULL,"SOCKET ERROR",NULL,MB_OK);
}

lpSock->Sock_in.sin_family=AF_INET;
lpSock->Sock_in.sin_port=htons(Port);
lpSock->Sock_in.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

setsockopt(lpSock->CreateSock,SOL_SOCKET,SO_REUSEADDR,(LPSTR)&lpSock->dwFlag,sizeof(lpSock->dwFlag));


if(bind(lpSock->CreateSock,(LPSOCKADDR)&lpSock->Sock_in,sizeof(lpSock->Sock_in))==SOCKET_ERROR)
{
closesocket(lpSock->CreateSock);
MessageBox(NULL,"BIND ERROR",NULL,MB_OK);
}

else if(listen(lpSock->CreateSock,1)==SOCKET_ERROR)
{
closesocket(lpSock->CreateSock);
MessageBox(NULL,"LISTEN ERROR",NULL,MB_OK);
}

hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)IPThread,(LPVOID)lpSock,0,&dwTid);
CloseHandle(hThread);
}


void WINAPI Handler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
closesocket(lpSockStru->CreateSock);
closesocket(lpSockStru->NewSock);
ss.dwWin32ExitCode=0;
ss.dwCurrentState=SERVICE_STOPPED;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);
if(lpSockStru!=NULL)
HeapFree(GetProcessHeap(),HEAP_NO_SERIALIZE,lpSockStru);
break;

case SERVICE_CONTROL_INTERROGATE:
SetServiceStatus (ssh,&ss);
break;
}
}


void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
ssh=RegisterServiceCtrlHandler("JIA.JIA.SERVICE",Handler);
ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_START_PENDING;
ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh, &ss);

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);
lpSockStru=(LPSOCKETSTRU)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SOCKETSTRU));
if(lpSockStru!=NULL) LogIP(lpSockStru,102);
}


void WINAPI InstallService()
{
SC_HANDLE scm;
SC_HANDLE svc;
TCHAR szFile[MAX_PATH];

GetModuleFileName(NULL,szFile,MAX_PATH);
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
svc=CreateService( scm,
"JIA.JIA.SERVICE",
"JIA.JIA.SERVICE",//Service名字
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, //以自动方式开始
SERVICE_ERROR_NORMAL,
szFile, //Service本体程序路径, 必须与具体位置相符
NULL,
NULL,
NULL,
NULL,
NULL
);
if(svc!=NULL)
{
CloseServiceHandle(svc);
CloseServiceHandle(scm);
StartupService();
}
}


void WINAPI DeleteServiceMy()
{
SC_HANDLE scm;
SC_HANDLE svc;
SERVICE_STATUS ServiceStatus;

scm=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
if(scm!=NULL)
{
svc=OpenService(scm,"JIA.JIA.SERVICE",SERVICE_ALL_ACCESS);
if (svc!=NULL)
{
QueryServiceStatus(svc,&ServiceStatus);
if (ServiceStatus.dwCurrentState==SERVICE_RUNNING)
ControlService(svc,SERVICE_CONTROL_STOP,&ServiceStatus);
DeleteService(svc);
CloseServiceHandle(svc);
MessageBox(NULL,"IPLog 服务已删除","删除",MB_OK);
}
CloseServiceHandle(scm);
}
else MessageBox(NULL,"IPLog 删除失败",NULL,MB_OK);
}

void WINAPI StartupService()
{
SC_HANDLE scm;
SC_HANDLE svc;

scm=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
if(scm!=NULL)
{
svc=OpenService(scm,"JIA.JIA.SERVICE",SERVICE_START);
if(svc!=NULL)
{
StartService(svc,0,NULL);
CloseServiceHandle(svc);
MessageBox(NULL,"服务已启动","启动",MB_OK);
}
CloseServiceHandle(scm);
}
else MessageBox(NULL,"启动服务失败",NULL,MB_OK);

}

void WINAPI InitService()
{
SERVICE_TABLE_ENTRY ste[2];

ste[0].lpServiceName="JIA.JIA.SERVICE";
ste[0].lpServiceProc=ServiceMain;
ste[1].lpServiceName=NULL;
ste[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ste);
InstallService();
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPre, LPSTR pCmd ,int iCmdShow)
{
static char szAppName[]="LogIP_Service" ;
HWND hWnd ;
MSG msg ;
WNDCLASSEX wndclass ;

wndclass.cbSize =sizeof (wndclass) ;
wndclass.style =CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc =WndProc ;
wndclass.cbClsExtra =0 ;
wndclass.cbWndExtra =0 ;
wndclass.hInstance =hInstance ;
wndclass.hIcon =LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor =LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground =(HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName =NULL ;
wndclass.lpszClassName =szAppName ;
wndclass.hIconSm =LoadIcon (NULL, IDI_APPLICATION) ;

RegisterClassEx (&wndclass) ;

hWnd=CreateWindow(szAppName,"IP_Service",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

ShowWindow(hWnd,SW_HIDE);
UpdateWindow(hWnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}


LRESULT CALLBACK WndProc (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch (iMsg)
{
case WM_CREATE :
InitService();
//DeleteService();
return 0 ;

case WM_DESTROY :
DeleteServiceMy();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,iMsg,wParam,lParam) ;
}

lovage 2002-06-06
  • 打赏
  • 举报
回复
服务必须在SCM数据库中注册,可以在注册表的下列关键字中找到数据库项目,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,
因为某些原因,这个关键字即包括设备的驱动文件,又包括服务,所以不要试图直接修改注册表,而因该使用特地为注册服务开发的API,
服务一般可以有三种方法来注册。

。通过安装服务的安装程序
。通过脚本或其他工具所启动的独立的注册程序
。通过命令行开关,作为参数传给服务。

但不管采用那种方式,服务总是通过调用 CreateService函数来注册的。。。




另,在补充一句,其实拿msdn东西来,并没有什么不对,毕竟许多问题,在那里就有答案,往往都是最好的,
lovage 2002-06-06
  • 打赏
  • 举报
回复
#include <winsvc.h>
lj9852 2002-06-06
  • 打赏
  • 举报
回复
你们不要老是把msdn的东西贴上来,说几句话行吗?
lj9852 2002-06-06
  • 打赏
  • 举报
回复
可以通过直接写注册表实现吗
加载更多回复(4)

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧