使用BHO时IE上的运行时错误216

时间:2011-01-15 23:01:47

标签: windows delphi internet-explorer browser bho

我正在研究用Delphi编写的浏览器帮助程序对象,当安装BHO并关闭IE时,我收到错误“运行时错误216 at< address>”。我怀疑这可能是因为以下代码中的253 disID(onquit)情况:

function TIEM.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
type
  POleVariant=^OleVariant;
var
  dps:TDispParams absolute Params;
  bHasParams:Boolean;
  pDispIDs:PDispIDList;
  iDispIDsSize:Integer;
begin
  Result:=DISP_E_MEMBERNOTFOUND;
  pDispIDs:=nil;
  iDispIDsSize:=0;
  bHasParams:=(dps.cArgs>0);
  if(bHasParams)then
  begin
    iDispIDsSize:=dps.cArgs*SizeOf(TDispID);
    GetMem(pDispIDs,iDispIDsSize);
  end;
  try
    if(bHasParams)then BuildPositionalDispIDs(pDispIDs,dps);
    case DispID of
      104:begin
          Result:=S_OK;
        end;
      250:begin
          DoBeforeNavigate2(IDispatch(dps.rgvarg^[pDispIDs^[0]].dispVal),
            POleVariant(dps.rgvarg^[pDispIDs^[1]].pvarVal)^,
            POleVariant(dps.rgvarg^[pDispIDs^[2]].pvarVal)^,
            POleVariant(dps.rgvarg^[pDispIDs^[3]].pvarVal)^,
            POleVariant(dps.rgvarg^[pDispIDs^[4]].pvarVal)^,
            POleVariant(dps.rgvarg^[pDispIDs^[5]].pvarVal)^,
            dps.rgvarg^[pDispIDs^[6]].pbool^);
          Result:=S_OK;
        end;
      252:
        begin
          DoNavigateComplete2(IDispatch(dps.rgvarg^[pDispIds^[0]].dispval), POleVariant(dps.rgvarg^[pDispIds^[1]].pvarval)^);
          Result := S_OK;
        end;
      259:
        begin
          DoDocumentComplete(IDispatch(dps.rgvarg^[pDispIds^[0]].dispval), POleVariant(dps.rgvarg^[pDispIds^[1]].pvarval)^);
          Result := S_OK;
        end;
      253:
        begin
          Result := S_OK;
        end;
    else
      Result := DISP_E_MEMBERNOTFOUND;
    end;
  finally
    if(bHasParams)then
      FreeMem(pDispIDs,iDispIDsSize);
  end;
end;

但我不确定,我找不到任何关于它的信息。我使用的是从an example on Hack China获得的库来创建BHO,我在253案例中发现了一些使用IConnectionPoint.Unadvise(Integer)的{​​{3}}。我尝试过,但仍然得到相同的运行时错误216.我也尝试在上面的代码中添加一个异常处理程序,但它没有捕获任何东西。

我补充说:

finalization
  exit;

现在我没有看到运行时错误。我不知道BHO会需要那个。

2 个答案:

答案 0 :(得分:4)

退出您的应用时出现216错误,表示您在项目的完成代码中触发了违规访问 > sysutils单元已经完成。

因此,请检查所有完成部分以了解无效指针的使用。在您的搜索中包括您在项目中使用的所有组件的最终部分。

要调试终结部分,可以在dpr的“end”语句中放置一个断点,当调试器中断时,使用F7进入终结代码,然后使用F7和F8逐步完成所有的终结部分。这将是一个繁琐的过程,但它会带您到导致访问冲突的确切语句。

答案 1 :(得分:1)

我补充说:

finalization
  exit;

现在我没有看到运行时错误。我不知道BHO会需要那个。