2011-01-15 2 views
2

Delphiで書かれたブラウザヘルパーオブジェクトで作業していて、BHOがインストールされてIEを閉じると、エラー "runtime error 216 at < address"私は、これが原因で、次のコードで253 disID(onquit)の場合のものであってもよい疑う:BHOを使用しているときにIEでランタイムエラー216が発生しました

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件で使用しています。私はそれを試みたが、同じランタイムエラー216を取得します。上記のコードに例外ハンドラを追加しようとしましたが、何もキャッチしませんでした。

私が追加:

finalization 
    exit; 

そして今、私は、ランタイムエラーが表示されませんが。私はBHOがそれを必要とするかどうかはわかりませんでした。

+0

私たちに適切なリンクをください。 –

+1

@Worm、評判のない新しいユーザーとして、彼はあなたに適切なリンクを与えることはできません。新しいユーザーには1つのリンクしか許可されません。 –

答えて

1

私が追加:

finalization 
    exit; 

そして今、私は、ランタイムエラーが表示されませんが。私はBHOがそれを必要とするかどうかはわかりませんでした。

4

アプリケーション終了時に216エラーが発生すると、のsysutilsユニットが既にファイナライズされた後に、プロジェクトの終了コードにアクセス違反が発生しています。

したがって、すべてのファイナライズセクションで無効なポインタを使用してください。検索には、プロジェクトで使用するすべてのコンポーネントのファイナライズセクションが含まれています。

ファイナライゼーションセクションをデバッグするには、dprの "end"ステートメントにブレークポイントを設定し、デバッガがブレークしたときにF7キーを使用してファイナライズコードを入力し、F7キーとF8キーを使用してファイナライゼーションセクション。退屈なプロセスですが、アクセス違反の原因となった正確な声明にあなたを導きます。

関連する問題