【问题标题】:Multithreaded Windows service in MingWMingW 中的多线程 Windows 服务
【发布时间】:2010-01-25 15:53:47
【问题描述】:

我正在尝试使用 MingW 构建 Windows 服务。它需要线程安全异常,所以我添加了链接器标志 -mthreads。该应用程序从命令行运行良好,但是当我尝试从 services.msc 启动它时,出现 1054 错误(“服务未及时响应启动或控制请求” ) 被提出。如果我在没有 -mthreads 标志的情况下重新构建它,服务就会启动。如何使用 -mthreads 来实现这个功能?

【问题讨论】:

    标签: c++ multithreading mingw


    【解决方案1】:

    我怀疑 -mthreads 引入了对 DLL 的依赖,而当它作为服务运行时,该 DLL 不在路径上。在我的 cygwin 环境中,如果我用“-mno-cygwin -mthreads”编译一个简单的程序,我会依赖 MINGWM10.DLL,它在作为服务运行时肯定不会出现在路径上。如果我尝试在未设置 PATH 的情况下运行它,它会在开始加载时崩溃(并在应用程序事件日志中留下一个垃圾)。

    我会在 Dependency Walker (http://www.dependencywalker.com) 中打开您的 exe,以查看您在加载时加载的内容,并检查您的 Windows 事件日志以查看是否有任何提示。您可能需要将所需的 DLL 副本与可执行文件放在一起。

    【讨论】:

      【解决方案2】:

      您需要工作目录或 [edit: system, not per user] PATH 中的 mingwm10.dll,因为使用 -mthread 选项编译的 C++ 程序具有该依赖性。如果你很确定你的代码永远不会抛出异常,也不会通过你的堆栈传播,请使用 -fno-exception 而不是 -mthread 来解决依赖关系。

      【讨论】:

        【解决方案3】:

        我想知道你是否可以在它作为服务运行时对其进行调试。当服务主机运行它时,一定有一些东西吓到了你的程序。也许尝试将调试器附加到 svchost.exe,至少您可以看到加载了哪些模块以及可能导致崩溃的异常。

        【讨论】:

        • 将调试器附加到 svchost.exe 没有帮助。该服务没有机会启动。甚至在此之前就抛出错误。
        【解决方案4】:

        您的应用程序是否已经启动?在main 函数的开头调用OutputDebugString(或等效函数),看看它是否能达到那么远。 (如果您还没有,请从 SysInternals 获取 DbgView。)

        如果还没有那么远,我们开始检查显而易见的问题:是不是应用程序没有找到运行时 DLL 的问题?可能是您在其 PATH 中有常规运行时,但找不到 MT 版本。这可以解释你描述的行为。您可能需要复制 MT 运行时或相应地更新 PATH。

        【讨论】:

        • 应用程序甚至没有启动。但它从命令行运行。所以这不是运行时库的问题。
        • 运行时库的 MT 版本在哪里?它应该在应用程序目录中。当以您的用户身份运行时,运行时库可能在 PATH 中可用,但作为系统不可用。使用depends.exe 来追踪您所依赖的dll。您也可以尝试以其他用户身份运行该应用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        相关资源
        最近更新 更多