2014-01-16 148 views
0

我们有一个64位应用程序作为Windows 7 64位上的服务运行。当我们手动启动服务时,它每次都能正常工作。当系统启动时自动启动服务时,有时(比如1/10)会失败。问题在于LoadLibrary函数实际上是它所做的第一件事。它是大部分代码所在的DLL的负载。我无法在计算机上重现它,所以我只是向国外的同事发送特殊的测试二进制文件。我使用无缓冲的写入操作将文本输出添加到文件,以便我可以确切地看到它消失的位置。没有崩溃转储,没有异常,没有返回NULL,它只是在LoadLibrary中的某处退出,系统启动后服务未运行。我们的库没有DllMain,但是如果我添加它,它不会到达那里(在失败情况下)。我尝试延迟加载依赖系统库,没有成功。看起来好像有时候某些东西还没有在Windows中启动,所以初始化失败了,我不确定。但在LoadLibrary之前添加睡眠并不能解决问题(睡得太晚?)。你有什么想法正在发生什么以及如何进行?我现在要逐步从我们的DLL中删除代码,逐个删除lib依赖关系,看看它是否会在某个时刻开始工作。我会很高兴在需要时提供更多信息。LoadLibrary在作为服务启动时有时会失败

+0

服务在启动之前对其他服务具有依赖性是很正常的。在Windows,Control Panel + Administrative Services中有明确的配置,右键单击您的服务,Properties,Dependencies选项卡。 搞清楚你所需要的服务不能从问题中猜出来。但是,当然可以通过反复试验来发现。查看一下执行类似工作的其他服务的依赖关系。 –

+0

是的,这可能是因为服务的顺序在变化,我们需要一些依赖项,这些依赖项在10个案例中的1个尚未开始。但后来我猜想,例如15秒睡眠(虽然当然不是一个好的解决方案)会有所帮助。但事实并非如此。如果我们不调用任何函数,就很难说需要哪个服务依赖项,只需加载我们的DLL库即可。我也可以改变行为静态加载它,也许它会告诉我们更多的服务日志或什么。 – Martin

+0

在这里,您可以看到我们有问题的DLL的其他库依赖项,也许您会发现需要等待哪些服务正确加载它们:kernel32.lib; user32.lib; gdi32.lib; winspool.lib; shell32.lib ; ole32.lib; oleaut32.lib; UUID.LIB; comdlg32.lib; advapi32.lib; secur32.lib; WS2_32.LIB; libeay32.lib; icuin.lib; icuuc.lib; zlibstatic.lib – Martin

回答

0

Lenovo RapidBoot Shield应用程序是原因。

“RapidBoot Shield通过延迟非关键应用程序和服务来帮助您的系统启动速度更快,但在某些情况下,RapidBoot Shield可能会延迟对系统启动至关重要的应用程序和/或服务,系统启动速度比预期慢,或者某些应用程序可能无法正常启动。“