我想在 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 中我不能写这样的东西。我现在应该怎么做?
问题是该结构定义如下:
typedef struct _SERVICE_TABLE_ENTRYW {
LPWSTR lpServiceName;
LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
} SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;
Run Code Online (Sandbox Code Playgroud)
LPWSTR是wchar_t*。字符串文字L"..."可以分配给const wchar_t*指针,但不能分配给wchar_t*指针。
以前,Visual C++ 编译器接受此类代码。现在它将接受 with /permissive,但会拒绝 with /permissive-。
/permissive是编译器的默认选项,但/permissive-在控制台应用程序项目模板中默认设置。一般来说,您不应该/permissive为新代码进行设置,它更像是移植旧代码的辅助工具。
因此,要修复编译,您可以:
/permissiveconst_cast通过C 风格强制转换抛弃常量wchar_t ServiceName[] = L"My Sample Service";最后一个选项通常是最安全的,因为它不做出类型系统未定义的假设。然而,其他的可能已经足够好了,因为这似乎是一个广泛使用的服务代码示例,而且它不太可能停止工作。
| 归档时间: |
|
| 查看次数: |
647 次 |
| 最近记录: |