在vs2019中创建服务

lig*_*ing 1 c++ winapi

我想在 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;
}
Run Code Online (Sandbox Code Playgroud)

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

SERVICE_TABLE_ENTRY ServiceTable[] =
        {
            {SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain},
            {NULL, NULL}
        };
Run Code Online (Sandbox Code Playgroud)

但是当我看视频教程时,作者完全写了上面的代码,但在 vs 2019 中我不能写这样的东西。我现在应该怎么做?

Ale*_*iev 5

问题是该结构定义如下:

typedef struct _SERVICE_TABLE_ENTRYW {
  LPWSTR                   lpServiceName;
  LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
} SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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