2011-01-15 8 views
2

Ich arbeite an einem Browser-Hilfsobjekt in Delphi geschrieben, und wenn das BHO installiert ist und ich IE schließe, erhalte ich den Fehler "Laufzeitfehler 216 bei < Adresse>". Ich vermute, dass dies wegen des 253 disID (OnQuit) Falles auf dem folgenden Code sein könnte:Laufzeitfehler 216 auf IE bei Verwendung von BHO

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; 

Aber ich bin nicht sicher, und ich konnte keine Informationen darüber finden. Ich verwende eine Bibliothek, die ich von an example on Hack China erhielt, um das BHO zu erstellen, und ich fand einige project on Google Code, die IConnectionPoint.Unadvise(Integer) auf dem 253 Fall verwendet. Ich habe das versucht, aber immer noch den gleichen Laufzeitfehler 216. Ich habe auch versucht, einen Ausnahme-Handler zu dem obigen Code hinzuzufügen, aber es hat nichts gefangen.

ich hinzugefügt:

finalization 
    exit; 

Und jetzt sehe ich nicht, die Laufzeitfehler. Ich wusste nicht, dass das BHO das brauchen würde.

+0

geben Sie uns den richtigen Link. –

+1

@Worm, als ein neuer Benutzer ohne Ruf, kann er wahrscheinlich * Ihnen keine richtige Verbindung geben; neuen Benutzern ist nur ein Link erlaubt. –

Antwort

1

ich hinzugefügt:

finalization 
    exit; 

Und jetzt sehe ich nicht, die Laufzeitfehler. Ich wusste nicht, dass das BHO das brauchen würde.

4

Ein 216 Fehler beim Beenden Ihrer App bedeutet, dass Sie eine Zugriffsverletzung im Finalisierungscode Ihres Projekts auslösen nach die sysutils-Einheit wurde bereits abgeschlossen.

Überprüfen Sie also alle Ihre Finalisierungsabschnitte auf ungültige Zeiger. Suchen Sie in Ihrer Suche die Finalisierungsabschnitte aller Komponenten, die Sie im Projekt verwenden.

Um Debugging-Abschnitte zu debuggen, können Sie einen Haltepunkt auf die "end" -Anweisung im dpr setzen und wenn der Debugger bricht, verwenden Sie F7, um in den Finalisierungscode zu gelangen, und dann mit F7 und F8 Finalisierungsabschnitte. Es wird ein langwieriger Prozess, aber es bringt Sie zu der genauen Anweisung, die die Zugriffsverletzung verursacht.