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

标签 windows delphi internet-explorer browser bho

我正在开发一个用 Delphi 编写的浏览器帮助程序对象,当安装 BHO 并关闭 IE 时,我收到错误“<地址>处的运行时错误 216”。我怀疑这可能是由于以下代码中的 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,我发现了一些project on Google Code在 253 案例中使用 IConnectionPoint.Unadvise(Integer)。我尝试过,但仍然得到相同的运行时错误 216。我还尝试向上述代码添加异常处理程序,但它没有捕获任何内容。

我添加:

finalization
  exit;

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

最佳答案

退出应用时出现 216 错误意味着您在 sysutils 单元完成之后项目的最终确定代码中触发了访问冲突。

因此,请检查所有终结部分是否使用了无效指针。在您的搜索中包括您在项目中使用的所有组件的最终确定部分。

要调试终结部分,您可以在 dpr 中的“end”语句上放置一个断点,当调试器在此中断时,使用 F7 单步执行终结代码,然后使用 F7 和 F8 单步执行所有终结部分。这将是一个乏味的过程,但它会让您找到导致访问冲突的确切语句。

关于windows - 使用 BHO 时 IE 上的运行时错误 216,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702658/

相关文章:

python - Windows shell %ERRORLEVEL% 变量是否有字符限制?

c# - Windows 上 Git 的持续集成

delphi - 使用关联字符串(键/值)的最简单方法是什么?

javascript - Internet Explorer 预加载(500 多张图片)

internet-explorer - IE 发送多个同名 cookie?

Windows批处理FOR循环范围通过命令行

windows - 应用程序在任务栏上可见吗?

delphi - TfrmMain 和 TApplication - 这些是做什么用的?

c# - Delphi Pipes.PAS 与 .NET 命名管道不兼容?

css - 为 IE 定制 Firefox/Chrome 样式表