在 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;
LPWSTR
是 wchar_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";
最后一个选项通常是最安全的,因为它不做类型系统未定义的假设。但是,其他的可能已经足够好了,因为这似乎是服务的广泛代码示例,而且它不太可能停止工作。
我想在 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;
LPWSTR
是 wchar_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";
最后一个选项通常是最安全的,因为它不做类型系统未定义的假设。但是,其他的可能已经足够好了,因为这似乎是服务的广泛代码示例,而且它不太可能停止工作。