在 vs2019 中创建服务

Creating a Service in vs2019

我想在 VS2019 中创建一个服务,但它没有模板。所以我创建了一个空项目,然后尝试从头开始编写服务。我写了下面的主要功能。

#define SERVICE_NAME  _T("My Sample Service")

int _tmain(int argc, TCHAR* argv[])
{
    OutputDebugString(_T("My Sample Service: Main: Entry"));

    SERVICE_TABLE_ENTRY ServiceTable[] =
    {
        {SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain},
        {NULL, NULL}
    };

    if (StartServiceCtrlDispatcher(ServiceTable) == FALSE)
    {
        OutputDebugString(_T("My Sample Service: Main: StartServiceCtrlDispatcher returned error"));
        return GetLastError();
    }

    OutputDebugString(_T("My Sample Service: Main: Exit"));
    return 0;
}

但是它说,你不能用 const wchar_t 初始化 LPWSTR。此错误属于以下行:

SERVICE_TABLE_ENTRY ServiceTable[] =
        {
            {SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain},
            {NULL, NULL}
        };

但是我在看视频教程的时候,作者确实写了上面的代码但是在vs 2019中我不能写这样的东西。我现在该怎么办?

问题是结构定义如下:

typedef struct _SERVICE_TABLE_ENTRYW {
  LPWSTR                   lpServiceName;
  LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
} SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;

LPWSTRwchar_t*。字符串文字 L"..." 可以分配给 const wchar_t* 指针,但不能分配给 wchar_t* 指针。

以前 Visual C++ 编译器接受这样的代码。现在它将接受 /permissive,但会拒绝 /permissive-

/permissive 是编译器的默认选项,但 /permissive- 在控制台应用程序项目模板中默认设置。通常,您不应该为新代码设置 /permissive,它更像是一种移植旧代码的辅助工具。

因此,要修复编译问题,您可以:

  • 使用/permissive
  • 通过 const_cast 或 C 风格转换
  • 抛弃常量
  • 使用非常量字符串,例如wchar_t ServiceName[] = L"My Sample Service";

最后一个选项通常是最安全的,因为它不做类型系统未定义的假设。但是,其他的可能已经足够好了,因为这似乎是服务的广泛代码示例,而且它不太可能停止工作。