我已经为我的 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 上的帮助和支持中心。