【问题标题】:COM method call returns Catastrophic Failure when BSTR is passed传递 BSTR 时,COM 方法调用返回 Catastrophic Failure
【发布时间】:2010-10-14 17:47:04
【问题描述】:

修改自previous question

注意:

  • BSTR变量传递给COM方法,HRESULT返回8000FFFF
  • 以前使用 接口指针 调用,成功:HRESULT 是 0
  • 执行,在 Visual Studio 内部成功,在外部失败 - 发布和调试

插图:

BSTR raw_sim_Open = SysAllocString (L"c:\\example.S8");

hresult = pis8->raw_Open (raw_sim_Open); //0x8000FFFF returned

编辑 - WinDbg:

First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=003a5be8 ebx=00009000 ecx=003a0208 edx=77606e00 esi=0012ec90 edi=00191b14
eip=003a0283 esp=0012ec34 ebp=0012ecb4 iopl=0         nv up ei ng nz ac pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010296
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
<Unloaded_PI32.dll>+0x3a0282:
003a0283 0080023a0088    add     byte ptr [eax-77FFC5FEh],al ds:0023:883a95ea=??

【问题讨论】:

  • 这是一个进程内或进程外 COM 服务器?
  • 进程外服务器(我正在调用)
  • 与上一个问题相比到底发生了什么变化?
  • 看起来像未定义的行为。 raw_Open() 方法的签名是什么 - 它的参数类型是什么?
  • 您尝试过 SysAllocStringLen() 解决方法吗?

标签: c++ windows visual-studio-2008 com


【解决方案1】:

调试构建和发布构建之间最显着的区别之一是调试库将内存初始化为零,而发布库不会。因此,如果某些东西在调试版本中工作但在发布版本中失败,可能的原因是一个或多个未初始化的变量。

【讨论】:

    【解决方案2】:

    就像 danbystrom 提到的,不同之处可能在于初始化。但这也会间接影响执行。例如,如果该方法不调用 SysStringLen 来确定字符串的长度,而是尝试将其用作以 null 结尾的字符串,该怎么办?这不太可能是问题的原因,但值得检查。

    如果是这种情况,以下内容会有所帮助。使用 SysAllocStringLen() 获取一个尾随空字符的 BSTR。

    【讨论】:

      【解决方案3】:

      E_UNEXPECTED 的返回一般不直接暗示任何事情。

      更多 COM 运行时错误更具体(例如 DCOM 连接丢失),因此返回 E_UNEXPECTED 的可能是 COM 组件本身。

      您需要检查或调试 COM 组件本身的实现。

      【讨论】:

      • 我不明白这个?您能解释一下“内部”VS 是什么意思吗?另外,什么是pis8?这段代码是你写的吗?您可以访问源代码吗?
      • @thehouse:在 Visual Studio 中执行,没有问题(即,没有从 HRESULT 返回 0x8000FFFF),pis8 - 是一个接口指针(此信息是从 MIDL 编译器生成的),最后 - 是
      • 仍然不清楚“内部”是什么意思。您的意思是使用调试器运行它吗? VS 只是一个 IDE。它没有内部或外部。正如 Richard 所说,您需要使用调试器单步执行对 raw_Open 的调用,并找出组件失败的位置。
      • 无法调试COM对象(服务器端)
      • @Atklin:即使在汇编程序级别使用本机调试器(以尽量减少影响)?如果没有更多详细信息,如果它引发可用于触发 ADPLus 的小型转储的 SEH 异常,则很难获得更多帮助……但需要更多详细信息。
      猜你喜欢
      • 2011-08-04
      • 2012-12-02
      • 2013-12-05
      • 2021-02-16
      • 2019-03-20
      • 2011-10-25
      • 2010-10-14
      • 2019-11-19
      • 1970-01-01
      相关资源
      最近更新 更多