Install Windows Service C++
Install Windows Service C++
我有下面的函数来安装我的windows c++服务,并且已经使用它很多年了。最近,我通过一些代码更改将其转换为unicode。对于多字节代码,代码仍然可以正常工作,并且创建运行时检查失败#2 -围绕变量"MyKey"的堆栈被unicode损坏。我认为在调用RegSetValueEx时可能有问题,但是找不到原因。欢迎提出任何建议。在函数调用结束时抛出错误。
static TCHAR* NTSERVICE=_T("MyService");
static TCHAR* svcname=_T("My Service");
void InstallService(char *exename)
{
SC_HANDLE myService, scm;
HKEY MyKey;
TRACE ("Installing service...");
scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
if (!scm) {
TRACE ("Failed to open Service Control Manager! (Error code = %d)", GetLastError());
return;
}
DWORD Disposition = 0;
TCHAR modname[256];
GetModuleFileName(NULL, (LPTSTR)modname, sizeof(modname)/sizeof(TCHAR));
myService = CreateService(scm,
(LPCTSTR)NTSERVICE, //Internal service name
(LPCTSTR)svcname, //Show name
SERVICE_ALL_ACCESS, //We want full control
SERVICE_WIN32_OWN_PROCESS, //Let's not mess it up for somebody else..
SERVICE_AUTO_START, //The service requires manual start
SERVICE_ERROR_NORMAL, //Normal handling when error in startup
(LPCTSTR)modname, //Binary file
0, 0, 0, 0, 0); //Misc :)
if (!myService)
{
TRACE (_T("Failed to create the %s service! (Error code =%d)"), NTSERVICE , GetLastError());
CloseServiceHandle(scm);
return;
}
TCHAR keyname[300];
_tcscpy_s(keyname,sizeof(keyname),_T("SYSTEM\CurrentControlSet\Services\"));
_tcscat_s(keyname,300, NTSERVICE);
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
(LPCTSTR)keyname,
NULL, //Reserved
NULL, //Class
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL, //Security attributes :)
&MyKey,
&Disposition)
!= ERROR_SUCCESS) {
TRACE(_T("Failed to open registry key!"));
return;
}
TCHAR buffer[1024];
int size = strlen(exename);
MultiByteToWideChar(CP_ACP, 0, (char*)exename, size, buffer, size*2);
buffer[size] = _T(' ');
if (RegSetValueEx(MyKey, _T("Exename"), NULL, REG_SZ, (const BYTE*)buffer,
(size + 1) * sizeof(TCHAR)) != ERROR_SUCCESS)
{
TRACE(_T("Failed to write binary executable name to registry!"));
// printf("Failed to write binary executable name to registry!");
RegCloseKey(MyKey);
return;
}
RegCloseKey(MyKey);
TRACE(_T("Service successfully installed."));
printf("Service successfully installed.");
CloseServiceHandle(myService);
CloseServiceHandle(scm);
}
GetModuleFileName(NULL, (LPTSTR)modname, sizeof(modname));
_tcscpy_s(keyname,sizeof(keyname),_T("SYSTEM\CurrentControlSet\Services\"));
sizeof
返回以字节为单位的大小。因为TCHAR
是定义了UNICODE的wchar_t
,所以字节数是字符数的两倍。
GetModuleFileName(NULL, (LPTSTR)modname, _countof(modname));
_tcscpy_s(keyname,_countof(keyname),_T("SYSTEM\CurrentControlSet\Services\"));
或
GetModuleFileName(NULL, (LPTSTR)modname, sizeof(modname)/sizeof(TCHAR));
_tcscpy_s(keyname,sizeof(keyname)/sizeof(TCHAR),_T("SYSTEM\CurrentControlSet\Services\"));
。
试试这个:
static const LPTSTR NTSERVICE = TEXT("MyService");
static const LPTSTR svcname = TEXT("My Service");
void InstallService(char *exename)
{
SC_HANDLE myService, scm;
HKEY MyKey;
TRACE (_T("Installing service..."));
scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
if (!scm) {
TRACE (_T("Failed to open Service Control Manager! (Error code = %d)"), GetLastError());
return;
}
TCHAR modname[MAX_PATH+1] = {0};
GetModuleFileName(NULL, modname, MAX_PATH);
myService = CreateService(scm,
NTSERVICE, //Internal service name
svcname, //Show name
SERVICE_ALL_ACCESS, //We want full control
SERVICE_WIN32_OWN_PROCESS, //Let's not mess it up for somebody else..
SERVICE_AUTO_START, //The service requires manual start
SERVICE_ERROR_NORMAL, //Normal handling when error in startup
modname, //Binary file
0, 0, 0, 0, 0); //Misc :)
if (!myService)
{
TRACE (_T("Failed to create the %s service! (Error code =%d)"), NTSERVICE, GetLastError());
CloseServiceHandle(scm);
return;
}
TCHAR keyname[300];
_tcscpy_s(keyname, 300, _T("SYSTEM\CurrentControlSet\Services\"));
_tcscat_s(keyname, 300, NTSERVICE);
DWORD Disposition = 0;
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
keyname,
NULL, //Reserved
NULL, //Class
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL, //Security attributes :)
&MyKey,
&Disposition) != ERROR_SUCCESS)
{
TRACE(_T("Failed to open registry key!"));
CloseServiceHandle(myService);
CloseServiceHandle(scm);
return;
}
TCHAR buffer[MAX_PATH+1] = {0};
#ifdef UNICODE
int len = MultiByteToWideChar(CP_ACP, 0, exename, strlen(exename), buffer, MAX_PATH);
#else
strcpy_s(buffer, MAX_PATH, exename);
int len = strlen(buffer);
#endif
buffer[len] = 0;
if (RegSetValueEx(MyKey,
TEXT("Exename"),
NULL,
REG_SZ,
(const BYTE*)buffer,
(len + 1) * sizeof(TCHAR)) != ERROR_SUCCESS)
{
TRACE(_T("Failed to write binary executable name to registry!"));
RegCloseKey(MyKey);
CloseServiceHandle(myService);
CloseServiceHandle(scm);
return;
}
RegCloseKey(MyKey);
CloseServiceHandle(myService);
CloseServiceHandle(scm);
TRACE(_T("Service successfully installed."));
printf("Service successfully installed.");
}
相关文章:
- Windows Service 可以枚举桌面顶级窗口吗?
- bad_weak_ptr使用从 boost::asio::io_context::service 继承的类
- C++ API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL依赖项问题
- 是否可以使用C /WinRT创建Windows Service应用程序
- Windows Service 无法调用 C++ 本机方法 [DllImpor( "myDLL" )]
- windows service SIGSEGV
- Singleton Service classes in c++
- 来自 MSDN 的 InternetGetConnectedState 和"it should not be used from a service"声明
- C++ in the cloud. Casablanca REST Service on Microsoft Azure
- Qt Web Service帖子查询
- C++ web service
- 为什么WinDbg无法通过Service Pack 2 x86零售符号下载从Windows Server 2003加载符
- 在Windows下编译Apache Thrift Service
- CAS: Service Ticket/CAS-Server reply is empty
- c++ SendInput在Windows Service中是可能的
- Windows Service (CodeGear c++ XE5)内存泄漏
- 如何从Windows Service主函数启动c++本地应用程序(应用程序与控制台交互)?
- 解析 Linux 内核文件时"Idle Service Error semantic-idle-summary-idle-function - Arithmetic error" cedet 语义错误
- 在windows7上从windows Service执行Notepad.exe时出现问题
- Install Windows Service C++