vc实现Service程序的相关问题 在vc里,又摸版直接生成Service,new一个atl项目,第三个类型就是Service,在Vc下调试Service,可以直接用F5运行,它可以以一个console程序运行起来或者先把Service起来,用msdev -p 进程id,来调试 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我是要在一个已经完成的普通MFC项目中添加代码,以实现Service的功能。你那直接new一个alt项目的方法行不通。 unkill(不死鸟) 谢谢你告诉我DEBUG的方法。 就我所知,Service其实是一个注册在本地的一个Dcom服务,系统是这个Dcom接口以后,实例化com,然后执行其中的代码.你可以debug看看,程序是否能够正确调用这个com接口? 服务程序一般都是控制台的很少有界面,其实有界面也可以,关键中的关键是一定要有一个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);} TO wyzegg:请教你的rpc.h如何写? To: wyzegg(蛋) 能留下你的Email吗?希望和你交流一下。我的[email protected] 菜鸟求助!CoCreateInstance返回E_NOINTERFACE 基于局域网的TCP通讯程序怎么移植到互联网? 对话框获得Edit时,CEdit成员m_hWnd为空 关于SendMessage函数的问题 十万火急..在线等,怎么解决C++中数据打印问题!! 如何实现JPEG2000的感兴趣区域编码 控件测试的问题? EnumThreadWindows为什么不成功? 小文题???? 如何从外面传数组给COM内部啊? 请教有哪位大侠在广域网上试验成功多播MultiCast了?!!!! 在线程运行中如何知道自己的句柄??(不是从创建时得到)
然后执行其中的代码.你可以debug看看,程序是否能够正确调用这个com接口?
下面的是一个简单的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.h如何写?
能留下你的Email吗?希望和你交流一下。
我的[email protected]