【问题标题】:Use libcurl in native c to write a Windows service在native c中使用libcurl写一个windows服务
【发布时间】:2011-02-17 15:30:48
【问题描述】:

有人知道怎么做吗?我试过了,但是 curl_global_init 总是有问题

“这个函数不是线程安全的。当程序中的任何其他线程(即共享相同内存的线程)正在运行时,您不能调用它。这不仅仅意味着没有其他线程正在使用 libcurl。因为curl_global_init() 调用其他类似线程不安全的库的函数,它可能与使用这些其他库的任何其他线程冲突。"

从本教程http://devx.com/cplus/Article/9857#codeitemarea 我得到了我的服务正常工作,但是,只需添加以下行:

if (rand() == -1) curl_global_init(CURL_GLOBAL_ALL); 

我收到错误 1053:服务没有及时响应启动或控制请求。即使只是调用 curl_version() 也会导致错误。

谢谢。

【问题讨论】:

    标签: c++ windows-services libcurl


    【解决方案1】:

    在拆分到线程之前发出curl_global_init()

    int main()
    {
      if ( curl_global_init(CURL_GLOBAL_ALL) ) {
        panic();
      }
      // here goes your program
    }
    

    【讨论】:

    • 服务不是一个普通的应用程序,通常有不同的结构。特别是,它的main 应该调用StartServiceCtrlDispatcher,而不是进行初始化。应从SvcMain 进行初始化。
    【解决方案2】:

    将您的服务安装为SERVICE_WIN32_OWN_PROCESS。显然,您自己的服务不应该在您调用curl_global_init 时创建任何线程。无论如何,您不应该在ReportSvcStatus(SERVICE_RUNNING) 之前创建线程,所以这应该不是什么大问题。只需在状态为SERVICE_START_PENDING 时调用curl_global_init

    【讨论】:

    • 从本教程devx.com/cplus/Article/9857#codeitemarea 我的服务正常工作,但是,只需添加以下行: if (rand() == 17) curl_global_init(CURL_GLOBAL_ALL);我收到错误 1053:服务没有及时响应启动或控制请求。即使我遵循你的建议!
    • if (rand()==17 让我无语。
    • 我的意思是即使没有运行 curl_global_init 也会发生这种情况。
    【解决方案3】:

    我认为您的问题不在于线程,就像您这样做一样:

    if (rand() == -1) curl_global_init(CURL_GLOBAL_ALL);
    

    那么curl_global_init 永远不会运行。

    但是 curl 库必须被链接。我认为这是你的问题——你的服务无法找到或加载这个库。也许服务找不到它,因为没有 shell 它没有正确的 PATH。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2011-05-31
      • 2014-11-27
      • 2019-03-23
      • 2013-12-08
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多