传递BSTR时,COM方法调用返回灾难性故障

时间:2009-03-21 14:55:18

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

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=??

3 个答案:

答案 0 :(得分:1)

调试版本和发布版本之间最值得注意的差异之一是调试库将内存初始化为零,而释放库则不然。因此,如果某些内容在调试版本中有效但在发布版本中失败,则可能的原因是一个或多个未初始化的变量。

答案 1 :(得分:1)

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

如果是这样,以下情况将有所帮助。使用SysAllocStringLen()获取具有尾随空字符的BSTR。

答案 2 :(得分:0)

E_UNEXPECTED的回复并不直接暗示任何事情。

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

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