【问题标题】:C create and run windows serviceC 创建并运行windows服务
【发布时间】:2020-08-06 16:19:05
【问题描述】:

我正在尝试创建一个将在系统启动时运行并立即启动它的服务。服务应该运行我的 exe 文件。 GetLastError 函数返回 1053 错误代码。

int main(void)
{
    SC_HANDLE SC_manager_handle;
    SC_HANDLE service_handle;
    LPCTSTR binary_path = "C:\\Users\\User\\AppData\\file.exe";
    LPCTSTR display_name = "ExampleService";
    LPCTSTR service_name = "EXAMPLE_SERVICE";

    SC_manager_handle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

    puts("-----------------------");
    if(SC_manager_handle == NULL)
        puts("Open SM Manager: FAILED");
    else
        puts("SC Manager: SUCCESS");
    
    service_handle = CreateService(SC_manager_handle, service_name, display_name, SERVICE_ALL_ACCESS ,SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, binary_path, NULL, NULL, NULL, NULL, NULL);

    if(service_handle == NULL)
        puts("Create Service: FAILED");
    else
        puts("Service Create: SUCCESS");

    // running the exe file immediately
    if(!StartService(service_handle, 0, NULL))
        printf("Start Service: FAILED | ERROR: %d\n", GetLastError());
    else
        puts("Service Start: SUCCESS");

    CloseServiceHandle(SC_manager_handle);
    CloseServiceHandle(service_handle);

    return 0;
}

【问题讨论】:

标签: c windows winapi


【解决方案1】:

我认为您错过了 Windows 服务的一些重要要求。根据MSDN

您需要一个服务主函数和一个控制处理函数,因为如果没有注册控制处理函数,您将无法处理“启动”命令。

所以你可以参考code了解如何编写ServiceMain函数并安装它。

如果要开通服务,按Starting a Service

为了启动一个服务,服务控制程序打开一个句柄到一个 安装的数据库,然后在调用中指定句柄 启动服务功能。启动服务后,程序使用 SERVICE_STATUS_PROCESS 结构返回的成员 QueryServiceStatusEx 函数来跟踪服务的进度。

我建议您参考使用服务的完整示例,这将极大地帮助您使用服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多