【问题标题】:Issues with porting COM+ applications from Windows 2003 to Windows 2008 Server将 COM+ 应用程序从 Windows 2003 移植到 Windows 2008 Server 的问题
【发布时间】:2010-08-26 08:55:41
【问题描述】:

我们正在将我们的应用程序从 Windows Server 2003 迁移到 Windows Server 2008 R2。我在迁移过程中遇到了一些问题。

我在 Windows Server 2008 R2 中部署了许多 COM+ 组件(32 位)和 DCOM 组件(32 位)。这些 COM+ 和 DCOM 组件是 VC++ 代码。

我在同一台服务器上部署了一个 .net 3.5 服务 32 位,它调用上面提到的 COM+ 组件。

每当我尝试启动服务时,它都不会启动并在事件日志中引发多个错误。

我们得到的主要错误是远程过程调用失败错误**。(**远程过程调用失败。(来自HRESULT的异常:0x800706BE))****根据调试期间的观察,COM对象是已创建,但调用某个方法时会抛出远程过程异常。

在 Win 2003 Server Box 中同样可以正常工作。

错误

第一个错误:

错误应用程序名称:dllhost.exe,版本:6.1.7600.16385,时间戳:0x4a5bc6b7

错误模块名称:KERNELBASE.dll,版本:6.1.7600.16385,时间戳:0x4a5bdbdf

异常代码:0xe06d7363

故障偏移:0x0000b727

故障进程ID:0x8ac

错误的应用程序启动时间:0x01cb437094216ea7

错误的应用程序路径:C:\Windows\SysWOW64\dllhost.exe

错误模块路径:C:\Windows\syswow64\KERNELBASE.dll

报告 ID:d25f6a31-af63-11df-8252-0050568e251b

第二个错误:

系统调用了一个自定义组件,该组件发生故障并产生异常。这表明自定义组件存在问题。通知该组件的开发人员发生故障并向他们提供以下信息。

服务器应用程序 ID:{727318BC-A725-4ED6-8DDD-9DE80262D3CA}

服务器应用程序实例 ID:

{739972C1-74DA-4169-A093-32AAAA965EC9}

服务器应用程序名称:

此错误的严重性质已导致进程终止。

例外:E06D7363

第三个错误:

故障桶,类型 0

活动名称:APPRCASH

回应:不可用

驾驶室编号:0

问题签名:

P1:dllhost.exe

P2:6.1.7600.16385

P3: 4a5bc6b7

P4: KERNELBASE.dll

P5:6.1.7600.16385

P6: 4a5bdbdf

P7: e06d7363

P8: 0000b727

P9:

P10:

附件:

这些文件可能在此处可用:

C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_dllhost.exe_58c2666ce94b9901a2cc454f2e8cd8cc5742421_085d298c

分析符号:

重新检查解决方案:0

报告 ID:d25f6a31-af63-11df-8252-0050568e251b

第 4 个错误:

故障桶,类型 0

活动名称:APPRCASH

回应:不可用

驾驶室编号:0

问题签名:

P1:dllhost.exe

P2:6.1.7600.16385

P3: 4a5bc6b7

P4: KERNELBASE.dll

P5:6.1.7600.16385

P6: 4a5bdbdf

P7: e06d7363

P8: 0000b727

P9:

P10:

附件:

这些文件可能在此处可用:

C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_dllhost.exe_58c2666ce94b9901a2cc454f2e8cd8cc5742421_085d298c

分析符号:

重新检查解决方案:0

报告 ID:d25f6a31-af63-11df-8252-0050568e251b

报告状态:0

第 5 个错误:

服务无法启动。 System.Runtime.InteropServices.COMException (0x800706BE):远程过程调用失败。 (HRESULT 异常:0x800706BE)

我们根据分析检查了以下内容,

1.权限问题 - 检查是否所有人、经过身份验证的用户、IWAM_ServerName 和 IUSR_ServerName 具有完全控制权。在论坛中看到他们应该对某些系统文件夹具有 NTFS 读取/执行权限。不知道如何检查。

2。 DLL Hell 问题 - 检查注册,一切似乎都很好。

3.进程“位”问题 - 检查注册表,所有条目都在 WoW6432 下,所有应用程序组件都是 32 位的。没有对 64 位组件的进程调用。还将 COM 用于 32 个应用程序。

4.防火墙问题 - 此服务与 COM 组件位于同一台机器上。我们是否应该更改一些与 MSTDC 安全性、高级防火墙配置(如启用 COM+ 入站)相关的设置?我们不确定,因为我们是第一次配置服务器。

  1. 启用“运行 32 位应用程序”复选框

但以上都无济于事。

此外,我们正在尝试使用示例组件复制该问题。我们创建了一个 .NET 组件并将其部署在 COM+ 中。尝试通过 VB 脚本和 C# 控制台应用程序访问它,它在 Windows 2003 框中运行良好。在 Windows 2008 Server 框中同样不起作用。我们没有收到 RPC 错误,而是出现以下错误,

vb 脚本错误:800a01ad activex 组件无法创建对象

.net 客户端调用 com+:CLASS NOT REGISTERED:HRESULT 0x80040154 (REGDB_E_CLASSNOTREG)

经过分析发现这些问题可能是由于权限问题、dll地狱或进程'bitness'问题。

如果有人能帮助我们解决这个问题,那就太好了。

谢谢, 维杰

【问题讨论】:

    标签: com windows-server-2008


    【解决方案1】:

    这都是同样的崩溃原因。您的组件引发了 C++ 异常,并且没有被 catch 语句捕获。使用调试器找出它抛出异常的原因。

    【讨论】:

    • +1。您可能对它崩溃的原因是正确的,但对于如何修复它却不是。你看,C++ 代码不能被限制抛出异常——时不时地会发生一些错误并且可以抛出异常。如果他专注于调查这个案子,他只会浪费时间。真正的解决方案是不允许异常通过 COM 边界传播。具体来说,可以通过 COM 调用的每个函数都应该捕获所有可能的可能被抛出的异常,并将它们转换为 HRESULT 和 IErrorInfo。
    猜你喜欢
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2015-05-14
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多