我正在尝试用MingW构建Windows服务。它需要线程安全的异常,所以我添加了链接标志-ththreads。该应用程序在命令行下工作正常,但是当我尝试从services.msc启动时,1054错误(“服务未及时响应启动或控制请求”)被引发。如果我在没有-mthreads标志的情况下重新构建服务,服务将启动。我如何才能使用-ththreads?MingW的多线程Windows服务
回答
我不知道你是否可以在作为服务运行时进行调试。当服务主机运行它时,必定会有一些让你的程序惊慌的事情。也许尝试附加一个调试器到svchost.exe,至少你可以看到哪些模块被加载,并且可能导致崩溃的异常。
你的应用程序甚至可以启动吗?在main
函数的开始处拨打OutputDebugString
(或等效函数),看看它是否能达到那么远。 (抓斗DbgView
从SysInternals如果没有它的话)
如果没有走到这一步,我们开始了明显的检查:这是没有找到运行时DLL的应用程序的问题?这可能是因为您的PATH中包含常规运行时,但无法找到MT版本。这可以解释你描述的行为。您可能需要复制MT运行时或相应地更新PATH。
该应用程序甚至没有启动。但它从命令行运行。所以它不能成为运行时库的问题。 – 2009-09-21 13:53:23
运行时库的MT版本在哪里?它应该在应用程序目录中。运行时库可能在PATH中作为用户运行,但不作为系统运行。使用depends.exe来追踪你所依赖的dll。您也可以尝试以另一个用户身份运行该应用程序。 – 2009-09-21 17:43:29
我怀疑-mthreads引入了对DLL的依赖关系,并且该DLL作为服务运行时不在路径上。在我的cygwin环境中,如果我用“-mno-cygwin -mthreads”编译了一个简单的程序,我得到了对MINGWM10.DLL的依赖,当它作为一个服务运行时,肯定不会在路径上。如果我尝试在没有设置PATH的情况下运行它,它会在开始加载时崩溃(并在应用程序事件日志中留下一片咕噜声)。
我会在Dependency Walker(http://www.dependencywalker.com)中调出你的exe文件,看看你在加载时正在加载什么,并检查你的Windows事件日志以查看是否有任何提示。您可能需要将它需要的DLL副本放在可执行文件中。
在工作目录或[编辑:系统,而不是每个用户] PATH中需要mingwm10.dll,因为使用-mthread选项编译的C++程序具有该依赖关系。如果你非常确定你的代码永远不会抛出异常,也不会通过堆栈传播,那么使用-fno-exception而不是-mthread来解决依赖关系。
- 1. 多线程Windows服务的线程库
- 2. 多线程Windows服务
- 3. 多线程Windows服务 - Erlang
- 4. Windows服务和多线程
- 5. Windows服务和mingw
- 6. 停止多线程的Windows服务
- 7. Windows服务中的多个线程
- 8. Windows服务中的多线程
- 9. Windows服务计时器多线程
- 10. 与Windows服务,blockingcollection和多线程
- 11. 线程的Windows服务
- 12. 暂停Windows服务线程?
- 13. 多线程Windows服务处理Windows Message Queue
- 14. 多线程服务器:SwingWorker Vs线程?
- 15. 线程加入多线程服务器
- 16. Windows服务和线程编程.NET
- 17. 多线程Web服务器
- 18. 多线程gSOAP服务
- 19. Java服务器多线程
- 20. 多线程咨询服务
- 21. 安卓多线程服务
- 22. 多线程web服务?
- 23. Android多线程服务
- 24. 多线程服务器Java
- 25. TCP多线程服务器
- 26. Android多线程和服务
- 27. 多线程服务器
- 28. Windows服务线程内的计时器
- 29. Windows服务的简单线程问题
- 30. 关闭具有线程的Windows服务
将调试器附加到svchost.exe没有帮助。该服务没有得到启动的机会。甚至在此之前抛出错误。 – 2009-09-17 03:48:56