怎样写一个Service Application?有这方面比较详细的资料或例程吗?(谢绝灌水)

寒星 2001-08-08 02:31:08
...全文
90 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
寒星 2001-08-10
  • 打赏
  • 举报
回复
哪位老大帮帮我?
寒星 2001-08-09
  • 打赏
  • 举报
回复
to:wyzegg(蛋) 
有没有DELPHI的源码?谢谢!
wyzegg 2001-08-08
  • 打赏
  • 举报
回复

非常简单的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);
}

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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