1

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

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

问题:
在安装项目中,自定义调用installservice.exelp30.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 ) 来启动服务。但行为与旧包不同。在这种情况下,我可能会缺少哪些其他配置?

4

2 回答 2

1

默认情况下,服务的当前目录是 Windows 服务的当前目录system32中所写的文件夹不是您所期望的。另请参阅此 StackOverflow 问题Windows 服务在哪个目录中运行?.

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

于 2013-01-04T15:20:24.490 回答
0

尝试使用如下命令行开关调用服务:

LP30.EXE /安装

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

尝试使用“sc”命令:

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

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

于 2013-01-04T20:34:22.520 回答