vc实现Service程序的相关问题

wawafish 2001-09-20 02:41:19
我想在MFC基础上实现Service程序。
我下载了MSDN中的例子,它是Console应用程序,我进行了相应的一些修改,结果服务启动不了。从控制面板中可以看到服务已经被安装,并且能被删除,不知怎么回事?
是不是ServiceStart()函数有错,还是service_main或service_ctrl有错?
请大家给我帮帮忙!留下EMAIL,我可以把代码给你发过去。

还有就是Service程序应该怎么去DEBUG?怎么能跟踪一步步到服务的启动?

谁要是有Service 程序的列子,麻烦能不能给我发一个,谢谢!
wawafish@eyou.com

...全文
152 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wawafish 2001-10-08
  • 打赏
  • 举报
回复
To: wyzegg(蛋)
能留下你的Email吗?希望和你交流一下。
我的wawafish@eyou.com
wyzegg 2001-10-01
  • 打赏
  • 举报
回复
看RPC怎么写MSDN上有例子
wyzegg 2001-10-01
  • 打赏
  • 举报
回复
rpc.h本来就有呀
djid 2001-09-29
  • 打赏
  • 举报
回复
TO wyzegg:
请教你的rpc.h如何写?
unkill 2001-09-25
  • 打赏
  • 举报
回复
好,又学到一招
unkill 2001-09-24
  • 打赏
  • 举报
回复
就我所知,Service其实是一个注册在本地的一个Dcom服务,系统是这个Dcom接口以后,实例化com,
然后执行其中的代码.你可以debug看看,程序是否能够正确调用这个com接口?
wyzegg 2001-09-24
  • 打赏
  • 举报
回复
服务程序一般都是控制台的很少有界面,其实有界面也可以,关键中的关键是一定要有一个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);
}
wawafish 2001-09-20
  • 打赏
  • 举报
回复
unkill(不死鸟) 谢谢你告诉我DEBUG的方法。
wawafish 2001-09-20
  • 打赏
  • 举报
回复
我是要在一个已经完成的普通MFC项目中添加代码,以实现Service的功能。你那直接new一个alt项目的方法行不通。

unkill 2001-09-20
  • 打赏
  • 举报
回复
在vc里,又摸版直接生成Service,new一个atl项目,第三个类型就是Service,
在Vc下调试Service,可以直接用F5运行,它可以以一个console程序运行起来
或者先把Service起来,用msdev -p 进程id,来调试

16,473

社区成员

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

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

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