我把接口函数改成这样, procedure snmpget(var ipaddress : Pchar; var oid : Pchar;var Value : Pchar; var ValueLength : Integer; var State:Integer; var VERSION : Integer; var Community : Pchar); stdcall; external 'snmp_pp.dll' name 'snmpget'; 然后程序里这样写: procedure TForm1.Button1Click(Sender: TObject); var ipaddress,oid,Value,Community : Pchar; ValueLength,Version,State:Integer; begin ipaddress := '172.24.224.10'; oid := '.1.3.6.1.2.1.1.1.0'; Value := ''; ValueLength := 0; State := 0; Version := 1; Community := 'public';snmpget(ipaddress,oid,Value,ValueLength,State,Version,Community); end;当程序执行玩snmpget这句以后,就出来Access violation错误。所以我觉的函数的调用方式已经没有问题了,只是两边的参数不对应,所以才出来这个错误。可是有不知该如何解决。
应该是: procedure snmpget(var ipaddress : Pchar; var oid : Pchar;var Value : Pchar; var ValueLength : Integer; var State:Integer; var VERSION : Integer; var Community : Pchar); cdecl; external 'snmp_pp.dll' name 'snmpget'; ~~~~~
应该是: procedure snmpget(var ipaddress : Pchar; var oid : Pchar;var Value : Pchar; var ValueLength : Integer; var State:Integer; var VERSION : Integer; var Community : Pchar); cdecl; external 'snmp_pp.dll' name 'snmpget'; ~~~~~
不,不应该是 type PInt = ^Integer; procedure snmpget(ipaddress : Pchar; oid : Pchar; Value : Pchar; ValueLength: PInt; state: PInt; version: integer; Community: pchar); cdecl; external 'snmp_pp.dll' name 'snmpget';
procedure TForm1.Button1Click(Sender: TObject); var ipaddress,oid,Value,Community : Pchar; ValueLength,Version,State:Integer; begin ipaddress := '172.24.224.10'; oid := '.1.3.6.1.2.1.1.1.0'; Value := ''; ValueLength := 0; State := 0; Version := 1; Community := 'public';snmpget(ipaddress,oid,Value,ValueLength,State,Version,Community); end;在我看来,你传入的指针有的没有初始化足够的空间,比如Value你初始化成'',dll就没有空间 存放数据了,qkl的声明应该是对的,我是用stdcall的! 所以我建议你这样调用: procedure TForm1.Button1Click(Sender: TObject); var ipaddress,oid,Value,Community : String; ValueLength,Version,State:Integer; begin ipaddress := '172.24.224.10'; oid := '.1.3.6.1.2.1.1.1.0'; SetLength(Value,足够大的空间{比如255,看你所传的值}); ValueLength := 0; State := 0; Version := 1; Community := 'public';snmpget(ipaddress,oid,PChar(Value),ValueLength,State,Version,Community); SetLength(Value,StrLen(Value)); // end;
to GreensPan 非常感谢你的帮助,我也怀疑是你说的这个原因,没有分配足够的空间。 可是,我按照你说的修改以后,编译时候居然出来这个错误Write Error on 'H:\Delphi\SNMP\Unit1.dcu',注释掉snmpget函数调用那一句就没有 这个错误,怎么回事?如果你不忙的话,我把那个Dll发给你,还有VC下的函数接口,你帮我看看?
非常感谢各位的帮助,终于搞定了. 函数是这样定义的: type PInteger = ^Integer; procedure snmpget(ipaddress : Pchar; oid : Pchar; Value : Pchar; ValueLength : PInteger; State:PInteger; VERSION : Integer; const Community : PChar); cdecl; external 'snmp_pp.dll' name 'snmpget';procedure TForm1.Button1Click(Sender: TObject); var ipaddress,oid,Value: array[0..999] of char; ValueLength,State:PInteger; begin ipaddress := '172.24.224.10'; oid := '.1.3.6.1.2.1.1.1.0'; Value := ''; New(ValueLength); ValueLength^ := 0; New(State); State^ := 0; snmpget(ipaddress,oid,Value,ValueLength,State,1,'public'); if (State^ = 0) then ShowMessage(Value); Dispose(ValueLength); Dispose(State); end;
procedure snmpget(var ipaddress : Pchar; var oid : Pchar;var Value : Pchar; var ValueLength : Integer; var State:Integer; var VERSION : Integer; var Community : Pchar); stdcall; external 'snmp_pp.dll' name 'snmpget';
然后程序里这样写:
procedure TForm1.Button1Click(Sender: TObject);
var
ipaddress,oid,Value,Community : Pchar;
ValueLength,Version,State:Integer;
begin
ipaddress := '172.24.224.10';
oid := '.1.3.6.1.2.1.1.1.0';
Value := '';
ValueLength := 0;
State := 0;
Version := 1;
Community := 'public';snmpget(ipaddress,oid,Value,ValueLength,State,Version,Community);
end;当程序执行玩snmpget这句以后,就出来Access violation错误。所以我觉的函数的调用方式已经没有问题了,只是两边的参数不对应,所以才出来这个错误。可是有不知该如何解决。
procedure snmpget(var ipaddress : Pchar; var oid : Pchar;var Value : Pchar; var ValueLength : Integer; var State:Integer; var VERSION : Integer; var Community : Pchar); cdecl; external 'snmp_pp.dll' name 'snmpget';
~~~~~
procedure snmpget(var ipaddress : Pchar; var oid : Pchar;var Value : Pchar;
var ValueLength : Integer; var State:Integer; var VERSION : Integer; var
Community : Pchar); cdecl; external 'snmp_pp.dll' name 'snmpget';
~~~~~
type
PInt = ^Integer;
procedure snmpget(ipaddress : Pchar; oid : Pchar; Value : Pchar; ValueLength:
PInt; state: PInt; version: integer; Community: pchar); cdecl; external
'snmp_pp.dll' name 'snmpget';
var
ipaddress,oid,Value,Community : Pchar;
ValueLength,Version,State:Integer;
begin
ipaddress := '172.24.224.10';
oid := '.1.3.6.1.2.1.1.1.0';
Value := '';
ValueLength := 0;
State := 0;
Version := 1;
Community := 'public';snmpget(ipaddress,oid,Value,ValueLength,State,Version,Community);
end;在我看来,你传入的指针有的没有初始化足够的空间,比如Value你初始化成'',dll就没有空间
存放数据了,qkl的声明应该是对的,我是用stdcall的!
所以我建议你这样调用:
procedure TForm1.Button1Click(Sender: TObject);
var
ipaddress,oid,Value,Community : String;
ValueLength,Version,State:Integer;
begin
ipaddress := '172.24.224.10';
oid := '.1.3.6.1.2.1.1.1.0';
SetLength(Value,足够大的空间{比如255,看你所传的值});
ValueLength := 0;
State := 0;
Version := 1;
Community := 'public';snmpget(ipaddress,oid,PChar(Value),ValueLength,State,Version,Community);
SetLength(Value,StrLen(Value));
//
end;
var
ipaddress,oid,Value,Community : String;
ValueLength,Version,State:PInteger;
begin
ipaddress := '172.24.224.10';//如果长度是传进去的长度就不用用SetLength分配空间了
oid := '.1.3.6.1.2.1.1.1.0';//如果长度是传进去的长度就不用用SetLength分配空间了
SetLength(Value,足够大的空间{比如255,看你所传的值});//Value := '';
ValueLength^ := 0;
State^ := 0;
Version^ := 1;
SetLength(Community,足够大的空间{比如255,看你所传的值});
snmpget(PChar(ipaddress),PChar(oid),PChar(Value),ValueLength,State,Version,PChar(Community));
SetLength(Value,StrLen(Value));SetLength(Community,StrLen(Community));
//
end;
非常感谢你的帮助,我也怀疑是你说的这个原因,没有分配足够的空间。
可是,我按照你说的修改以后,编译时候居然出来这个错误Write Error
on 'H:\Delphi\SNMP\Unit1.dcu',注释掉snmpget函数调用那一句就没有
这个错误,怎么回事?如果你不忙的话,我把那个Dll发给你,还有VC下的函数接口,你帮我看看?
函数是这样定义的:
type
PInteger = ^Integer;
procedure snmpget(ipaddress : Pchar; oid : Pchar; Value : Pchar; ValueLength : PInteger; State:PInteger; VERSION : Integer; const Community : PChar); cdecl; external 'snmp_pp.dll' name 'snmpget';procedure TForm1.Button1Click(Sender: TObject);
var
ipaddress,oid,Value: array[0..999] of char;
ValueLength,State:PInteger;
begin
ipaddress := '172.24.224.10';
oid := '.1.3.6.1.2.1.1.1.0';
Value := '';
New(ValueLength);
ValueLength^ := 0;
New(State);
State^ := 0; snmpget(ipaddress,oid,Value,ValueLength,State,1,'public'); if (State^ = 0) then
ShowMessage(Value); Dispose(ValueLength);
Dispose(State);
end;