程序要符合服务程序的条件,关键要有servicemain然后使用服务API把程序安装到服务管理器里
下面是一个RPC服务程序的例子
#include "iostream.h"
#include "stdio.h"
#include "rpc.h"
#include "windows.h"
#include "mathe.h"
#include "winsvc.h"SERVICE_STATUS servicestatus;
SERVICE_STATUS_HANDLE servicestatushandle;
void WINAPI ServiceCtrlHandler(DWORD dwControl);
void WINAPI ServiceMain(DWORD argc, LPTSTR * argv);void _CRTAPI1 main()
{
RPC_STATUS status;
RPC_BINDING_VECTOR *pBindingVector=NULL;
UCHAR * pszProtocolSequence=(UCHAR *)"ncacn_ip_tcp";
WORD wMinCalls=1;
WORD wMaxCalls=30;
UCHAR *pszEndPoint=(UCHAR *)"8080";
WORD fWaitFlag=FALSE;
// UCHAR * pszEntryName=(UCHAR *)
SERVICE_TABLE_ENTRY servicetableentry[] =
{
{ "MyBigService", ServiceMain },
{ NULL, NULL }
};
StartServiceCtrlDispatcher(servicetableentry);
status=RpcServerUseProtseqEp(
pszProtocolSequence,
wMaxCalls,
pszEndPoint,
NULL);
if(status==RPC_S_OK)
{
printf("succes create !\n");
}
//来注册接口,第一个参数是midl编译器定义的接口id.第二个参数指定使用指针类型的管理器UUID.
//他和值为null的第三个参数设置服务器,使用默认的管理器和由midl编译的代理残根所产生的入口点矢量。
status = RpcServerRegisterIf(mathematic_v1_0_s_ifspec, // interface to register
NULL, // MgrTypeUuid
NULL); // MgrEpv; null means use default
printf("RpcServerRegisterIf returned 0x%x\n", status);
if (status==RPC_S_OK)
{
printf("register interface success\n");
}
status = RpcServerListen(wMinCalls,
wMaxCalls,
fWaitFlag);//最后一个参数是false表示do wait
printf("RpcServerListen returned: 0x%x\n", status);
if (status) {
exit(status);
}
//阻止这个服务器在rpc调用到达之前退出
if (fWaitFlag) {
printf("Calling RpcMgmtWaitServerListen\n");
status = RpcMgmtWaitServerListen(); // wait operation
printf("RpcMgmtWaitServerListen returned: 0x%x\n", status);
if (status) {
exit(status);
}
}
}
/*********************************************************************/
/* MIDL allocate and free */
/*********************************************************************/void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
return(malloc(len));
}void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
free(ptr);
}long add(
/* [in] */ long lNum1,
/* [in] */ long lNum2,
/* [retval][out] */ long *rNum)
{
*rNum=lNum1+lNum2;
return *rNum;
}
double fAdd(
/* [in] */ double dNum1,
/* [in] */ long dNum2,
/* [retval][out] */ double * dRetNum)
{
* dRetNum=dNum1+dNum2;
return *dRetNum;
}double minus(
/* [in] */ double minus1,
/* [in] */ double minus2,
/* [retval][out] */ double *dRetMinus)
{
*dRetMinus=minus1-minus2;
return *dRetMinus;
}double mul(
/* [in] */ double mul1,
/* [in] */ double mul2,
/* [retval][out] */ double *dRetMul)
{
*dRetMul=mul1*mul2;
return *dRetMul;
}boolean divide(
/* [in] */ double div1,
/* [in] */ double div2,
/* [retval][out] */ double *dRetDiv)
{
if(div2==0)
return FALSE;
else
*dRetDiv=div1/div2;
return TRUE;
}
void WINAPI ServiceMain(DWORD argc, LPTSTR * argv)
{
int bInitialized = 0;
servicestatus.dwServiceType = SERVICE_WIN32;
servicestatus.dwCurrentState = SERVICE_START_PENDING;
servicestatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
servicestatus.dwWin32ExitCode = 0;
servicestatus.dwServiceSpecificExitCode = 0;
servicestatus.dwCheckPoint = 0;
servicestatus.dwWaitHint = 0; servicestatushandle =RegisterServiceCtrlHandler("MyBigService", ServiceCtrlHandler);
if (servicestatushandle == (SERVICE_STATUS_HANDLE)0)
{
return;
}
// Initialize the service
// ...
bInitialized = 1; servicestatus.dwCheckPoint = 0;
servicestatus.dwWaitHint = 0;
if (!bInitialized)
{
servicestatus.dwCurrentState = SERVICE_STOPPED;
servicestatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
servicestatus.dwServiceSpecificExitCode = 1;
}
else
{
servicestatus.dwCurrentState = SERVICE_RUNNING;
}
SetServiceStatus(servicestatushandle, &servicestatus);
return;
}
void WINAPI ServiceCtrlHandler(DWORD dwControl)
{
switch (dwControl)
{
case SERVICE_CONTROL_PAUSE:
servicestatus.dwCurrentState = SERVICE_PAUSE_PENDING;
SetServiceStatus(servicestatushandle, &servicestatus);
// TODO: add code to pause the service
// not called in this service
// ...
servicestatus.dwCurrentState = SERVICE_PAUSED;
break; case SERVICE_CONTROL_CONTINUE:
servicestatus.dwCurrentState = SERVICE_CONTINUE_PENDING;
SetServiceStatus(servicestatushandle, &servicestatus);
// TODO: add code to unpause the service
// not called in this service
// ...
servicestatus.dwCurrentState = SERVICE_RUNNING;
break; case SERVICE_CONTROL_STOP:
servicestatus.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(servicestatushandle, &servicestatus);
// TODO: add code to stop the service
// ...
servicestatus.dwCurrentState = SERVICE_STOPPED;
break; case SERVICE_CONTROL_SHUTDOWN:
// TODO: add code for system shutdown
// ...
break; case SERVICE_CONTROL_INTERROGATE:
// TODO: add code to set the service status
// ...
servicestatus.dwCurrentState = SERVICE_RUNNING;
break;
}
SetServiceStatus(servicestatushandle, &servicestatus);
}
下面是一个RPC服务程序的例子
#include "iostream.h"
#include "stdio.h"
#include "rpc.h"
#include "windows.h"
#include "mathe.h"
#include "winsvc.h"SERVICE_STATUS servicestatus;
SERVICE_STATUS_HANDLE servicestatushandle;
void WINAPI ServiceCtrlHandler(DWORD dwControl);
void WINAPI ServiceMain(DWORD argc, LPTSTR * argv);void _CRTAPI1 main()
{
RPC_STATUS status;
RPC_BINDING_VECTOR *pBindingVector=NULL;
UCHAR * pszProtocolSequence=(UCHAR *)"ncacn_ip_tcp";
WORD wMinCalls=1;
WORD wMaxCalls=30;
UCHAR *pszEndPoint=(UCHAR *)"8080";
WORD fWaitFlag=FALSE;
// UCHAR * pszEntryName=(UCHAR *)
SERVICE_TABLE_ENTRY servicetableentry[] =
{
{ "MyBigService", ServiceMain },
{ NULL, NULL }
};
StartServiceCtrlDispatcher(servicetableentry);
status=RpcServerUseProtseqEp(
pszProtocolSequence,
wMaxCalls,
pszEndPoint,
NULL);
if(status==RPC_S_OK)
{
printf("succes create !\n");
}
//来注册接口,第一个参数是midl编译器定义的接口id.第二个参数指定使用指针类型的管理器UUID.
//他和值为null的第三个参数设置服务器,使用默认的管理器和由midl编译的代理残根所产生的入口点矢量。
status = RpcServerRegisterIf(mathematic_v1_0_s_ifspec, // interface to register
NULL, // MgrTypeUuid
NULL); // MgrEpv; null means use default
printf("RpcServerRegisterIf returned 0x%x\n", status);
if (status==RPC_S_OK)
{
printf("register interface success\n");
}
status = RpcServerListen(wMinCalls,
wMaxCalls,
fWaitFlag);//最后一个参数是false表示do wait
printf("RpcServerListen returned: 0x%x\n", status);
if (status) {
exit(status);
}
//阻止这个服务器在rpc调用到达之前退出
if (fWaitFlag) {
printf("Calling RpcMgmtWaitServerListen\n");
status = RpcMgmtWaitServerListen(); // wait operation
printf("RpcMgmtWaitServerListen returned: 0x%x\n", status);
if (status) {
exit(status);
}
}
}
/*********************************************************************/
/* MIDL allocate and free */
/*********************************************************************/void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
return(malloc(len));
}void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
free(ptr);
}long add(
/* [in] */ long lNum1,
/* [in] */ long lNum2,
/* [retval][out] */ long *rNum)
{
*rNum=lNum1+lNum2;
return *rNum;
}
double fAdd(
/* [in] */ double dNum1,
/* [in] */ long dNum2,
/* [retval][out] */ double * dRetNum)
{
* dRetNum=dNum1+dNum2;
return *dRetNum;
}double minus(
/* [in] */ double minus1,
/* [in] */ double minus2,
/* [retval][out] */ double *dRetMinus)
{
*dRetMinus=minus1-minus2;
return *dRetMinus;
}double mul(
/* [in] */ double mul1,
/* [in] */ double mul2,
/* [retval][out] */ double *dRetMul)
{
*dRetMul=mul1*mul2;
return *dRetMul;
}boolean divide(
/* [in] */ double div1,
/* [in] */ double div2,
/* [retval][out] */ double *dRetDiv)
{
if(div2==0)
return FALSE;
else
*dRetDiv=div1/div2;
return TRUE;
}
void WINAPI ServiceMain(DWORD argc, LPTSTR * argv)
{
int bInitialized = 0;
servicestatus.dwServiceType = SERVICE_WIN32;
servicestatus.dwCurrentState = SERVICE_START_PENDING;
servicestatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
servicestatus.dwWin32ExitCode = 0;
servicestatus.dwServiceSpecificExitCode = 0;
servicestatus.dwCheckPoint = 0;
servicestatus.dwWaitHint = 0; servicestatushandle =RegisterServiceCtrlHandler("MyBigService", ServiceCtrlHandler);
if (servicestatushandle == (SERVICE_STATUS_HANDLE)0)
{
return;
}
// Initialize the service
// ...
bInitialized = 1; servicestatus.dwCheckPoint = 0;
servicestatus.dwWaitHint = 0;
if (!bInitialized)
{
servicestatus.dwCurrentState = SERVICE_STOPPED;
servicestatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
servicestatus.dwServiceSpecificExitCode = 1;
}
else
{
servicestatus.dwCurrentState = SERVICE_RUNNING;
}
SetServiceStatus(servicestatushandle, &servicestatus);
return;
}
void WINAPI ServiceCtrlHandler(DWORD dwControl)
{
switch (dwControl)
{
case SERVICE_CONTROL_PAUSE:
servicestatus.dwCurrentState = SERVICE_PAUSE_PENDING;
SetServiceStatus(servicestatushandle, &servicestatus);
// TODO: add code to pause the service
// not called in this service
// ...
servicestatus.dwCurrentState = SERVICE_PAUSED;
break; case SERVICE_CONTROL_CONTINUE:
servicestatus.dwCurrentState = SERVICE_CONTINUE_PENDING;
SetServiceStatus(servicestatushandle, &servicestatus);
// TODO: add code to unpause the service
// not called in this service
// ...
servicestatus.dwCurrentState = SERVICE_RUNNING;
break; case SERVICE_CONTROL_STOP:
servicestatus.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(servicestatushandle, &servicestatus);
// TODO: add code to stop the service
// ...
servicestatus.dwCurrentState = SERVICE_STOPPED;
break; case SERVICE_CONTROL_SHUTDOWN:
// TODO: add code for system shutdown
// ...
break; case SERVICE_CONTROL_INTERROGATE:
// TODO: add code to set the service status
// ...
servicestatus.dwCurrentState = SERVICE_RUNNING;
break;
}
SetServiceStatus(servicestatushandle, &servicestatus);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货