我想在 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我寫不出這樣的東西。我現在該怎么辦?
uj5u.com熱心網友回復:
這已經被問過很多次了,但顯然我找不到一個好的副本來鏈接這里。
問題是結構定義如下:
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"
最后一個選項通常是最安全的,因為它不做未由型別系統定義的假設。但是,其他的可能已經足夠好了,因為這似乎是服務的廣泛代碼示例,而且它不太可能停止作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331736.html
