Delphi 7中GetIpForwardTable实现的问题

时间:2011-08-01 10:58:47

标签: delphi

我已经将这段代码放在一起,用于查看My delphi App中的路由表。

  PMIB_IPFORWARDROW = ^TMibIpForwardRow;
TMibIpForwardRow=packed record
dwForwardDest:DWORD;
dwForwardMask:DWORD;
dwForwardPolicy:DWORD;
dwForwardNextHop:DWORD;
dwForwardIfIndex:DWORD;
dwForwardType:DWORD;
dwForwardProto:DWORD;
dwForwardAge:DWORD;
dwForwardNextHopAS:DWORD;
dwForwardMetric1:DWORD;
dwForwardMetric2:DWORD;
dwForwardMetric3:DWORD;
dwForwardMetric4:DWORD;
dwForwardMetric5:DWORD;
end;

PMIB_IPFORWARDTABLE=^TMibIpForwardTable ;
TMibIpForwardTable=packed record
dwNumEntries:DWORD;
table:array [0..ANY_SIZE-1] of TMibIpForwardRow;
end;

功能宣言是:

 getIpForwardTable: function (pIpForwardTable:PMIB_IPFORWARDTABLE; pdwSize:PULONG; bOrder:BOOL):DWORD; stdcall;

实施功能是:

  procedure GetRouteTable;
 var
 Error:DWORD;
 pRouteTable:PMIB_IPFORWARDTABLE ;
   dwSize:ULONG;
  //dwSize:ULONG;
  TableSize:Integer;
 begin
  try
    dwSize:=0;
    GetMem(pRouteTable,SizeOf(TMibIpForwardTable));
   Error:=GetIpForwardTable(pRouteTable,@dwSize,FALSE);// Error at this line
   if Error=NO_ERROR then
   begin
     ShowMessage(IntToStr(Error));

    end
    else
        ShowMessage(IntToStr(Error));
   except
     on E:Exception do
     ShowMessage(E.ClassName+':'+E.Message);
     end;
   end;

我收到错误代码= 122。请帮助纠正此错误。

先谢谢

修改

我也试过这个组合但它没有用

  Error:=GetIpForwardTable(nil,@dwSize,FALSE);
  if Error=ERROR_INSUFFICIENT_BUFFER then
    ShowMessage(IntToStr(Error))
  else
  begin
    GetMem(pRouteTable,dwSize);
  Error:=getIpForwardTable(pRouteTable,@dwSize,False);
   if Error=NO_ERROR then
  begin
    ShowMessage(IntToStr(Error));
  end
  else
    ShowMessage(IntToStr(Error));

1 个答案:

答案 0 :(得分:2)

错误代码122是ERROR_INSUFFICIENT_BUFFERGetIpForwardTable的文档声明在发生以下情况时会返回此错误代码。

  

pIpForwardTable参数指向的缓冲区不够大。所需大小在pdwSize参数指向的DWORD变量中返回。

解决方法是读取返回的dwSize的值,然后使用该大小的缓冲区再次调用。


您的代码的另一个问题是您没有传入有效的缓冲区。请注意,永远不会将变量pRouteTable分配给。在您的编辑中,您可以调用GetMem来分配它,但是在错误的位置。你需要这样的东西:

Error := GetIpForwardTable(nil, @dwSize, False);
if Error<>ERROR_INSUFFICIENT_BUFFER then
  RaiseLastOSError(Error);
GetMem(pRouteTable,dwSize);
Error := GetIpForwardTable(pRouteTable, @dwSize, False);
if Error<>ERROR_SUCCESS then
  RaiseLastOSError(Error);