Ваш код требует преобразования, потому что вы вызываете макрос OpenService()
на основе TCHAR
, который отображается либо на OpenServiceW()
, либо на OpenServiceA()
в зависимости от того, определено UNICODE
:
__checkReturn
WINADVAPI
SC_HANDLE
WINAPI
OpenServiceA(
__in SC_HANDLE hSCManager,
__in LPCSTR lpServiceName,
__in DWORD dwDesiredAccess
);
__checkReturn
WINADVAPI
SC_HANDLE
WINAPI
OpenServiceW(
__in SC_HANDLE hSCManager,
__in LPCWSTR lpServiceName,
__in DWORD dwDesiredAccess
);
#ifdef UNICODE
#define OpenService OpenServiceW
#else
#define OpenService OpenServiceA
#endif // !UNICODE
В вашем случае UNICODE
четко определен в вашем проекте, поэтому ваш код действительно вызывает OpenServiceW()
, поэтому он ожидает LPCWSTR
в качестве ввода.
Ваш RestartServer()
методпринимает в качестве ввода строку CStringA
(char
на основе ANSI), поэтому вы должны явно использовать OpenServiceA()
для совпадения с тем же типом символов, преобразование не требуется:
bool MyClassName::RestartServer(const CStringA& serviceName)
{
...
SC_HANDLE SHandle = OpenServiceA(hSCManager, serviceName, SC_MANAGER_ALL_ACCESS);
...
}
В противном случае, если выесли вы продолжите использовать в своем коде функциональность на основе TCHAR
1 , тогда вам следует изменить метод RestartServer()
, чтобы он принимал CString
вместо CStringA
, чтобы он принимал тот же ANSI / Unicodeотображение, которое делает OpenService()
(и другие функции на основе TCHAR
), снова избегая преобразования:
1: что вам не следует делать, поскольку редко требуется когда-либо писать коддля Win9x / ME в настоящее время.Windows была Unicode-ОС начиная с NT4.
bool MyClassName::RestartServer(const CString& serviceName)
Если это не вариант для вас, то CA2W()
будет работать просто отлично:
bool MyClassName::RestartServer(const CStringA& serviceName)
{
USES_CONVERSION;
...
SC_HANDLE SHandle = OpenService(hSCManager, ATL::CA2W(serviceName), SC_MANAGER_ALL_ACCESS);
...
}
Тем не менее, вы можете рассмотреть возможность использования CString
внутри и позволить ему обрабатывать преобразование при необходимости:
bool MyClassName::RestartServer(const CStringA& serviceName)
{
...
SC_HANDLE SHandle = OpenService(hSCManager, CString(serviceName), SC_MANAGER_ALL_ACCESS);
...
}
Или сделать код условным:
bool MyClassName::RestartServer(const CStringA& serviceName)
{
...
SC_HANDLE SHandle = OpenService(hSCManager,
#ifdef UNICODE
CStringW(serviceName)
#else
serviceName
#endif
, SC_MANAGER_ALL_ACCESS);
...
}