简体   繁体   English

安装Windows Service C ++

[英]Install Windows Service C++

I have the following function to install my windows c++ service and have used it for many years. 我具有以下功能来安装Windows c ++服务,并且已经使用了很多年。 Recently, I have worked to convert it to unicode with some code changes. 最近,我进行了一些代码更改,将其转换为unicode。 The code still works fine for multi-bytes code, and create Run-time check failure #2 - Stack around the variable "MyKey" was corrupted for unicode. 该代码对于多字节代码仍然可以正常工作,并创建运行时检查失败#2-Unicode损坏了变量“ MyKey”周围的堆栈。 I think that there may be a problem in calling RegSetValueEx, but cannot find the reason. 我认为调用RegSetValueEx可能有问题,但找不到原因。 Any suggestions are welcome. 欢迎任何建议。 Th error throws at the end of the function call. 错误在函数调用的末尾引发。

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('\0');
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 returns the size in bytes. sizeof返回字节大小。 Because TCHAR is wchar_t with UNICODE defined, the number of bytes is twice the number of characters. 因为TCHAR是定义了UNICODE的wchar_t ,所以字节数是字符数的两倍。

Use 采用

GetModuleFileName(NULL, (LPTSTR)modname, _countof(modname));
 _tcscpy_s(keyname,_countof(keyname),_T("SYSTEM\\CurrentControlSet\\Services\\"));

or 要么

GetModuleFileName(NULL, (LPTSTR)modname, sizeof(modname)/sizeof(TCHAR));
 _tcscpy_s(keyname,sizeof(keyname)/sizeof(TCHAR),_T("SYSTEM\\CurrentControlSet\\Services\\"));

instead. 代替。

Try this instead: 尝试以下方法:

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.");
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM