我已经将这段代码放在一起,用于查看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));
答案 0 :(得分:2)
错误代码122是ERROR_INSUFFICIENT_BUFFER
。 GetIpForwardTable
的文档声明在发生以下情况时会返回此错误代码。
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);