aboutsummaryrefslogtreecommitdiff
path: root/src/common/Platform/ServiceWin32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/Platform/ServiceWin32.cpp')
-rw-r--r--src/common/Platform/ServiceWin32.cpp36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/common/Platform/ServiceWin32.cpp b/src/common/Platform/ServiceWin32.cpp
index be827a8308a..72964701a0c 100644
--- a/src/common/Platform/ServiceWin32.cpp
+++ b/src/common/Platform/ServiceWin32.cpp
@@ -19,6 +19,7 @@
#include "Log.h"
#include <cstring>
+#include <tchar.h>
#include <windows.h>
#include <winsvc.h>
@@ -31,9 +32,9 @@
#endif
extern int main(int argc, char ** argv);
-extern char serviceLongName[];
-extern char serviceName[];
-extern char serviceDescription[];
+extern TCHAR serviceLongName[];
+extern TCHAR serviceName[];
+extern TCHAR serviceDescription[];
extern int m_ServiceStatus;
@@ -49,11 +50,11 @@ bool WinServiceInstall()
if (serviceControlManager)
{
- char path[_MAX_PATH + 10];
+ TCHAR path[_MAX_PATH + 10];
if (GetModuleFileName( nullptr, path, sizeof(path)/sizeof(path[0]) ) > 0)
{
SC_HANDLE service;
- std::strcat(path, " --service run");
+ _tcscat(path, _T(" --service run"));
service = CreateService(serviceControlManager,
serviceName, // name of service
serviceLongName, // service name to display
@@ -70,7 +71,7 @@ bool WinServiceInstall()
nullptr); // no password
if (service)
{
- HMODULE advapi32 = GetModuleHandle("ADVAPI32.DLL");
+ HMODULE advapi32 = GetModuleHandle(_T("ADVAPI32.DLL"));
if (!advapi32)
{
CloseServiceHandle(service);
@@ -182,7 +183,16 @@ void WINAPI ServiceControlHandler(DWORD controlCode)
SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
-void WINAPI ServiceMain(DWORD argc, char *argv[])
+template<size_t size>
+void TCharToChar(TCHAR const* src, char(&dst)[size])
+{
+ if constexpr (std::is_same_v<TCHAR, char>)
+ ::strcpy_s(dst, src, size);
+ else
+ ::wcstombs_s(nullptr, dst, src, _TRUNCATE);
+}
+
+void WINAPI ServiceMain(DWORD /*argc*/, TCHAR *argv[])
{
// initialise service status
serviceStatus.dwServiceType = SERVICE_WIN32;
@@ -197,12 +207,12 @@ void WINAPI ServiceMain(DWORD argc, char *argv[])
if ( serviceStatusHandle )
{
- char path[_MAX_PATH + 1];
+ TCHAR path[_MAX_PATH + 1];
unsigned int i, last_slash = 0;
GetModuleFileName(nullptr, path, sizeof(path)/sizeof(path[0]));
- size_t pathLen = std::strlen(path);
+ size_t pathLen = _tcslen(path);
for (i = 0; i < pathLen; i++)
{
if (path[i] == '\\') last_slash = i;
@@ -227,8 +237,12 @@ void WINAPI ServiceMain(DWORD argc, char *argv[])
////////////////////////
m_ServiceStatus = 1;
- argc = 1;
- main(argc, argv);
+
+ char cArg[_MAX_PATH + 1];
+ TCharToChar(argv[0], cArg);
+ char* cArgv[] = { cArg };
+
+ main(1, cArgv);
// service was stopped
serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;