2009-09-16 43 views
7

我正在尝试用MingW构建Windows服务。它需要线程安全的异常,所以我添加了链接标志-ththreads。该应用程序在命令行下工作正常,但是当我尝试从services.msc启动时,1054错误(“服务未及时响应启动或控制请求”)被引发。如果我在没有-mthreads标志的情况下重新构建服务,服务将启动。我如何才能使用-ththreadsMingW的多线程Windows服务

回答

1

我不知道你是否可以在作为服务运行时进行调试。当服务主机运行它时,必定会有一些让你的程序惊慌的事情。也许尝试附加一个调试器到svchost.exe,至少你可以看到哪些模块被加载,并且可能导致崩溃的异常。

+0

将调试器附加到svchost.exe没有帮助。该服务没有得到启动的机会。甚至在此之前抛出错误。 – 2009-09-17 03:48:56

1

你的应用程序甚至可以启动吗?在main函数的开始处拨打OutputDebugString(或等效函数),看看它是否能达到那么远。 (抓斗DbgViewSysInternals如果没有它的话)

如果没有走到这一步,我们开始了明显的检查:这是没有找到运行时DLL的应用程序的问题?这可能是因为您的PATH中包含常规运行时,但无法找到MT版本。这可以解释你描述的行为。您可能需要复制MT运行时或相应地更新PATH。

+0

该应用程序甚至没有启动。但它从命令行运行。所以它不能成为运行时库的问题。 – 2009-09-21 13:53:23

+0

运行时库的MT版本在哪里?它应该在应用程序目录中。运行时库可能在PATH中作为用户运行,但不作为系统运行。使用depends.exe来追踪你所依赖的dll。您也可以尝试以另一个用户身份运行该应用程序。 – 2009-09-21 17:43:29

5

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

我会在Dependency Walker(http://www.dependencywalker.com)中调出你的exe文件,看看你在加载时正在加载什么,并检查你的Windows事件日志以查看是否有任何提示。您可能需要将它需要的DLL副本放在可执行文件中。

2

在工作目录或[编辑:系统,而不是每个用户] PATH中需要mingwm10.dll,因为使用-mthread选项编译的C++程序具有该依赖关系。如果你非常确定你的代码永远不会抛出异常,也不会通过堆栈传播,那么使用-fno-exception而不是-mthread来解决依赖关系。