Ошибка выполнения 216 в IE при использовании BHO - PullRequest
2 голосов
/ 16 января 2011

Я работаю над вспомогательным объектом браузера, написанным на 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;

Но я не уверен, и я не мог найти информацию об этом. Я использую библиотеку, которую я взял из примера по Hack China для создания BHO, и я нашел какой-то проект в Google Code , который использует IConnectionPoint.Unadvise(Integer) для случая 253. Я пытался это сделать, но все равно получал ту же ошибку времени выполнения 216. Я также пытался добавить обработчик исключений в приведенный выше код, но он ничего не перехватил.

Я добавил:

finalization
  exit;

И теперь я не вижу ошибки времени выполнения. Я не знал, что это понадобится БХО.

Ответы [ 2 ]

4 голосов
/ 16 января 2011

Ошибка 216 при выходе из приложения означает, что вы вызываете нарушение прав доступа в коде завершения вашего проекта после модуль sysutils уже завершен.

Итак, проверьте все разделы финализации для использования недействительных указателей. В ваш поиск включите разделы финализации всех компонентов, которые вы используете в проекте.

Чтобы отладить разделы финализации, вы можете поставить точку останова в операторе «end» в dpr, а когда отладчик прервет его, используйте F7, чтобы войти в код финализации, затем используйте F7 и F8, чтобы пройти всю финализацию разделы. Это будет утомительный процесс, но он приведет вас к точному утверждению, вызывающему нарушение прав доступа.

1 голос
/ 23 февраля 2011

Я добавил:

finalization
  exit;

А сейчас я не вижу ошибки времени выполнения. Я не знал, что BHO понадобится это.

...