3

尝试开发我的第一个 Windows 服务,我正在 Windows 7 MS VC++ 10.0 中进行调试。只要它调用 StartServiceCtrlDispatcher(),我就会收到错误 1063,它说访问被拒绝。我是管理员,我究竟如何通过这个?我是服务新手。谢谢。代码:

// For WinXp, don't forget to link to
// Advapi32.lib library if needed...

#define _WIN32_WINNT 0x0501

#include <windows.h>

#include <stdio.h>
#include <tchar.h>

// Prototypes, just empty skeletons...

void SvcDebugOut(LPSTR String, DWORD Status);
void  WINAPI MyServiceCtrlHandler(DWORD opcode);
void  MyServiceStart(DWORD argc, LPTSTR *argv);
DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError);

void main() 
{

       // Using 2-D array as a table...

       // The name of a service to be run in this service process - "MyService",

       // The function as the starting point for a service - MyServiceStart or

       // a pointer to a ServiceMain() function...

       // The members of the last entry in the table must have NULL values

       // to designate the end of the table...

       SERVICE_TABLE_ENTRY  DispatchTable[] = {{_TEXT("MyService"), (LPSERVICE_MAIN_FUNCTION)MyServiceStart}, {NULL, NULL}};
   if (!StartServiceCtrlDispatcher(DispatchTable))
       SvcDebugOut("StartServiceCtrlDispatcher() failed, error: %d\n", GetLastError());
   else
       printf("StartServiceCtrlDispatcher() looks OK.\n");
   return;
} 

// ==========================================================================
// Prototype definitions...just skeletons here...
void  WINAPI MyServiceCtrlHandler(DWORD opcode)
{
       // Service control information here...
       return;
}

void  MyServiceStart(DWORD argc, LPTSTR *argv)
{
       // Starting service information here...
       return;
}



DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError)
{
       // Service initialization information here...
       return 0;
}

// Very simple info to the standard output...
void SvcDebugOut(LPSTR String, DWORD Status)
{
   CHAR  Buffer[1024];
   printf("In SvcDebugOut() lol!\n");
   if (strlen(String) < 1000)
   {
      sprintf(Buffer, String, Status);
      OutputDebugStringA(Buffer);
   }
   else 
      printf("String too long...\n");
   return;
}
4

2 回答 2

2

这篇文章回答正确。只要您不将服务“作为服务”启动,它就不会起作用。

你需要注册它。为此,请查看此文件,它是 Apple bonjour 服务实现,它是开源的。

它很好地说明了安装服务必须做什么。特别是方法 InstallService - 和 RemoveService (如果你想删除它)。

于 2016-10-28T15:41:06.853 回答
0

服务在其注册属性中指定的帐户下运行。注册服务或启动服务的帐户可能不同。读到这个。

许多服务在功能非常有限的“网络服务”帐户下运行。这是有道理的,因为许多服务处理来自网络的请求。这就是微软默认选择“网络服务”的原因。

于 2013-06-29T07:56:49.237 回答