我正在研究用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会需要那个。
答案 0 :(得分:4)
退出您的应用时出现216错误,表示您在项目的完成代码中触发了违规访问 >> sysutils单元已经完成。
因此,请检查所有完成部分以了解无效指针的使用。在您的搜索中包括您在项目中使用的所有组件的最终部分。
要调试终结部分,可以在dpr的“end”语句中放置一个断点,当调试器中断时,使用F7进入终结代码,然后使用F7和F8逐步完成所有的终结部分。这将是一个繁琐的过程,但它会带您到导致访问冲突的确切语句。
答案 1 :(得分:1)
我补充说:
finalization
exit;
现在我没有看到运行时错误。我不知道BHO会需要那个。