【问题标题】:Windows service start issue with old dlls旧 dll 的 Windows 服务启动问题
【发布时间】:2013-01-04 14:38:21
【问题描述】:

背景:
如果我安装旧的安装包(1998 年创建),服务启动没有任何问题。这个包是使用 InstallShield 创建的,项目代码不可用。它使用本地部署,所有依赖的 DLL 都在 bin 目录中。 它使用自定义 installservice.exe(此代码也不可用)将 lp30.exe 安装为 Windows 服务。

我在做什么:
我需要使用 VS 2010 在 win2k8 上创建一个可工作的可安装包。在 VC++ 上,我可以使用文件和文件夹结构创建 .msi 和安装文件,并从旧安装中识别出注册表项。

问题:
在安装项目中,进行自定义以调用 installservice.exe 以将 lp30.exe 安装为服务。但服务启动以以下错误结束:

 "Error: 1053 The service did not respond to the start or control request in a timely fashion"

分析:
installservice.exe 无法将 lp30.exe 作为服务启动。在库调用 PS2FaxW.dll 函数时失败。这是一个可追溯到 1998 年的第三方 DLL,其源代码不可用。

DLL 在应用程序路径中可用,不需要注册表。我发现它们已加载。但是在使用 dependencywalker 进行分析时,我看到以下错误:

GetProcAddress(0x75790000 [KERNEL32.DLL], "IsTNT") called from "PS2FAXW.DLL" at address 0x10003F81 and returned NULL. Error: The specified procedure could not be found (127).

LoadLibraryA("\LincPag2.dll") returned NULL. Error: The specified module could not be found (126).

最后退出

Exited "LP30.EXE" (process 0x1DE8) with code 126 (0x7E).    

问题:
我使用相同的“installservice.exe”和相同的应用程序 (lp30.exe) 来启动服务。但行为与旧包不同。在这种情况下,我可能还缺少哪些其他配置?

【问题讨论】:

  • 由于登录凭据或权限,我有时会遇到无法启动服务的问题。您是否尝试过将服务作为本地管理员帐户运行以确保其与权限无关?

标签: visual-studio-2010 visual-c++ installshield


【解决方案1】:

默认情况下,服务的当前目录是system32 文件夹,如Current directory for Windows service is not what you expect 所写。另请参阅此 StackOverflow 问题What directory does a Windows Service run in?。

本质上,您的服务正在尝试从 system32 加载 DLL,而不是应用程序目录。您可以尝试将 LincPag2.dll 放入 system32 中,看看是否能暂时解决问题。我不认为将 DLL 放在 system32 中是最好的长期解决方案,但它可能是一个有用的调试步骤。

【讨论】:

    【解决方案2】:

    尝试使用这样的命令行开关调用服务:

    LP30.EXE /安装

    LP30.EXE 是否对控制台产生任何输出?

    尝试使用“sc”命令:

    sc create LP30 binPath="\"C:\Program Files\Foo\LP30.exe""

    如果一切都失败了,请运行 Process Monitor 下的原始 (1998) 程序,看看它到底在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多