Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CreateService获取错误:错误\u无效\u地址(0x000001e7)_C++_Winapi_Service - Fatal编程技术网

C++ CreateService获取错误:错误\u无效\u地址(0x000001e7)

C++ CreateService获取错误:错误\u无效\u地址(0x000001e7),c++,winapi,service,C++,Winapi,Service,请帮我解决这个问题: 我在此代码中创建了一个基本服务: #include "stdafx.h" PWSTR pszServiceName; PWSTR pszDisplayName; DWORD dwStartType; PWSTR pszDependencies; PWSTR pszAccount; PWSTR pszPassword; #define MAX_PATH 100 void __cdecl _tmain(int argc, TCHAR *argv[]) {

请帮我解决这个问题:

我在此代码中创建了一个基本服务:

#include "stdafx.h"

PWSTR pszServiceName;
PWSTR pszDisplayName; 
DWORD dwStartType;
PWSTR pszDependencies; 
PWSTR pszAccount;
PWSTR pszPassword;

#define MAX_PATH 100

void __cdecl _tmain(int argc, TCHAR *argv[]) 
{ 
    wchar_t szPath[MAX_PATH];
    SC_HANDLE schSCManager = NULL;
    SC_HANDLE schService = NULL;

    if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)) == 0)
    {
        wprintf(L"GetModuleFileName failed w/err 0x%08lx\n", GetLastError());
        goto Cleanup;
    }

    // Open the local default service control manager database
    schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT | 
        SC_MANAGER_CREATE_SERVICE);
    if (schSCManager == NULL)
    {
        wprintf(L"OpenSCManager failed w/err 0x%08lx\n", GetLastError());
        goto Cleanup;
    }

    // Install the service into SCM by calling CreateService
    schService = CreateService(
        schSCManager,                   // SCManager database
        pszServiceName,                 // Name of service
        pszDisplayName,                 // Name to display
        SERVICE_QUERY_STATUS,           // Desired access
        SERVICE_WIN32_OWN_PROCESS,      // Service type
        dwStartType,                    // Service start type
        SERVICE_ERROR_NORMAL,           // Error control type
        szPath,                         // Service's binary
        NULL,                           // No load ordering group
        NULL,                           // No tag identifier
        pszDependencies,                // Dependencies
        pszAccount,                     // Service running account
        pszPassword                     // Password of the account
        );
    if (schService == NULL)
    {
        wprintf(L"CreateService failed w/err 0x%08lx\n", GetLastError());
        goto Cleanup;
    }

    wprintf(L"%s is installed.\n", pszServiceName);

Cleanup:
    // Centralized cleanup for all allocated resources.
    if (schSCManager)
    {
        CloseServiceHandle(schSCManager);
        schSCManager = NULL;
    }
    if (schService)
    {
        CloseServiceHandle(schService);
        schService = NULL;
    }
} 
当我运行它时,我得到错误:CreateService失败w/err 0x000001e7(我只知道它是:error\u INVALID\u ADDRESS)-但我不知道确切的意思是什么,以及如何修复


任何人都可以帮我。

除了
schSCManager
szPath
变量外,所有传递给
CreateService()
的其他变量都没有初始化,它们包含随机值。这对于
psz…
变量尤其重要,因为它们是指针,所以您可以有效地将随机内存地址传递给
CreateService()
。这就是为什么会出现
错误\u无效\u地址
错误的原因

您需要初始化变量

pszServiceName
需要指向包含所需服务名称的以null结尾的字符串

pszDisplayName
需要指向包含所需服务显示名称的以null结尾的字符串

dwStartType
需要包含有效的开始类型整数值

pszDependencies
需要为NULL,或者指向一个以双NULL结尾的字符串,该字符串包含服务所依赖的以NULL分隔的服务名称列表

pszAccount
需要为NULL或指向以NULL结尾的字符串,该字符串包含运行服务所需的用户帐户

pszPassword
需要为NULL或指向包含
pszAccount
帐户密码的以NULL结尾的字符串

编辑:您最好干脆完全去掉变量,并将所需的值直接传递给
CreateService()
。试试这个:

#include "stdafx.h"

void __cdecl _tmain(int argc, TCHAR *argv[]) 
{ 
    wchar_t szPath[MAX_PATH+1];
    SC_HANDLE schSCManager = NULL;
    SC_HANDLE schService = NULL;

    if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)) == 0)
    {
        wprintf(L"GetModuleFileName failed w/err 0x%08lx\n", GetLastError());
        goto Cleanup;
    }

    // Open the local default service control manager database
    schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE);
    if (schSCManager == NULL)
    {
        wprintf(L"OpenSCManager failed w/err 0x%08lx\n", GetLastError());
        goto Cleanup;
    }

    // Install the service into SCM by calling CreateService
    schService = CreateService(
        schSCManager,                   // SCManager database
        L"Win32_Service,                // Name of service
        L"My Service,                   // Name to display
        SERVICE_QUERY_STATUS,           // Desired access
        SERVICE_WIN32_OWN_PROCESS,      // Service type
        SERVICE_DEMAND_START,           // Service start type
        SERVICE_ERROR_NORMAL,           // Error control type
        szPath,                         // Service's binary
        NULL,                           // No load ordering group
        NULL,                           // No tag identifier
        NULL,                           // No Dependencies
        L"NT AUTHORITY\\LocalService",  // Service running account
        NULL                            // No Password of the account
        );
    if (schService == NULL)
    {
        wprintf(L"CreateService failed w/err 0x%08lx\n", GetLastError());
        goto Cleanup;
    }

    wprintf(L"Service is installed.\n");

Cleanup:
    // Centralized cleanup for all allocated resources.
    if (schService)
    {
        CloseServiceHandle(schService);
        schService = NULL;
    }
    if (schSCManager)
    {
        CloseServiceHandle(schSCManager);
        schSCManager = NULL;
    }
} 

谢谢,我也按照您的建议编辑:lstrcpyW(pszServiceName,L“Win32_服务”);lstrcpyW(pszDisplayName,L“我的服务”);dwStartType=服务需求启动;lstrcpyW(pszdependences,L“);lstrcpyW(pszAccount,L“NT AUTHORITY\\LocalService”);pszPassword=NULL;但它还是那个错误@Thuy Duong:为什么你要重新定义MAX_路径?也许您的名称比CreateService长,但失败了。@Remy Lebeau:我按照您的建议进行编辑,但仍然存在错误,为什么?@ThùyDương:您不能使用lstrcpyW()将字符串复制到尚未分配的内存中。最好是完全去掉变量,直接将所需的值传递给CreateService()。@ThùyDương这个答案在很多方面都是正确的。你会为自己学习一个重要的服务,学习(a)C++语言,(b)一般的Windows编程,和(c)Windows服务编程,然后在Web上删除示例代码,然后只是把它砍掉,使之成为“工作”。不了解你在做什么,你就不是工程师;你真的在猜。(答案是+1,雷米)错误结果中的“无效”和“地址”这两个词到底是什么秘密?