2

我已经为我的 COM 服务器 DLL 和客户端应用程序创建了必要的清单,以便在 Windows XP 中免注册。我已经测试了各种组合(有和没有注册),并且在所有情况下,如果清单存在,客户端应用程序会看到库的并行版本,如果没有(或 COM 错误),则看到已注册的如果根本没有注册)。我已经在我的 Windows XP 开发机器上进行了测试,并将文件(DLL、客户端 EXE 和每个清单)提供给同事,他们也在自己的 Windows XP 机器上成功运行了所有内容。清单是外部 XML 文件,而不是嵌入式资源。到现在为止还挺好。

但是,当我将文件复制到 Windows Server 2003 机器时,它不起作用。我得到一个静默失败,但在应用程序事件日志中出现应用程序错误(见下文)。如果我取消注册 DLL 并删除清单,我会收到类似的错误(在命令提示符下无声,但在事件日志中出现应用程序错误)。显然在查找注册时存在一些问题。我已经在我们公司可以访问的每台 Windows Server 2003 机器上复制了这个。根据有关并行/免注册 COM 的 Microsoft 文档,它应该适用于 Windows XP 及更高版本,以及 Windows Server 2003 及更高版本。

需要明确的是,相同的客户端在相同的 Windows Server 2003 机器上针对相同 COM DLL 的注册使用 regsvr32)版本在我尝试用于免注册 COM 的相同登录凭据下完美运行。换句话说,不存在伪装成免注册 COM 问题的内在问题 - 当服务器在注册表中全局注册时,此客户端和服务器运行良好。

有人对如何进一步调查有任何想法吗?我不是 Windows Server 方面的专家,但是否可能需要更改某些策略设置才能启用此支持?如果我能找到必要的更改,我们的技术支持/基础设施人员可能不会这样做,但我不能依赖他们来研究这个问题,因为他们已经被淹没了。

万一它很重要(我认为它不应该,但你永远不知道)DLL 是用 Delphi 2007 编写的,而客户端是用 Visual C++ 编写的。

事件类型:信息
事件源:应用程序错误
活动类别:(100)
事件 ID:1004
日期:2009 年 5 月 2 日
时间:上午 8:07:45
用户:不适用
计算机:***服务器名称****
描述:
报告排队错误:故障应用程序***程序名称***.exe,版本0.0.0.0,故障模块***程序名称***.exe,版本0.0.0.0,故障地址0x0002ac9e。

有关详细信息,请参阅 http://go.microsoft.com/fwlink/events.asp 上的帮助和支持中心。
4

2 回答 2

7

要查找的一件事是 exe 是否具有内部清单。在 XP 中,exe 清单搜索顺序是外部的,然后是内部的。在 Server 2003 及更高版本中,顺序是内部的,然后是外部的。

于 2009-05-05T17:02:52.430 回答
0

对于在 Delphi 7 中创建的 COM 服务器,如果未注册 COM 服务器并且客户端应用程序在受限用户帐户下启动,我会看到类似的问题,因为 Delphi 的 COM 实现总是试图更新注册信息,即使 DLL 的 RegisterServer 函数是没有显式调用。

要查看这是否是一个问题,请尝试在具有不受限制的管理权限的帐户上运行客户端应用程序。

MSDN 提到,在 Windows 2003 下,免注册 COM 服务器的问题应在系统事件日志的特定部分中详细说明:

在解决免注册 COM 问题时,Windows Server 2003 上的事件查看器是您的朋友。当 Windows XP 或 Windows Server 2003 检测到配置错误时,它通常会显示一个错误消息框,标题为您已启动的应用程序并包含消息“此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题问题。” 我建议,每当您看到此消息时,您会在 Windows Server 2003 上重现该问题,请查阅系统事件日志并从 SideBySide 源中查找事件。我不建议您在这些情况下查看 Windows XP 事件日志的原因是它总是包含诸如“ 为 [path][application filename].Manifest 生成激活上下文失败。参考错误消息:操作成功完成”,这无助于识别问题。 http://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic6

此外,如果可能,请告诉我们您使用的清单文件的文件名和内容。

于 2009-05-05T13:43:18.307 回答