改用 cdecl 调用约定就行.

解决方案 »

  1.   

    我把接口函数改成这样,
      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错误。所以我觉的函数的调用方式已经没有问题了,只是两边的参数不对应,所以才出来这个错误。可是有不知该如何解决。
      

  2.   

    应该是:
      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';
                        ~~~~~
      

  3.   

    应该是:
      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';
                        ~~~~~
      

  4.   

    不,不应该是
    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';
      

  5.   

    照你说的该了,把stdcall 改成 cdecl, 编译运行,当执行到那一句时,还是有Access violation错误。:(
      

  6.   

    不只把 stdcall 改成 cdecl,还有其他改动,注意了没有。我现在经常要调用 vc 写的 DLL(没问题) ,调用方式一般是 cdecl ,但我不敢肯定(不过不难),但你的参数是错了。
      

  7.   

    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;
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;
      

  9.   

    to GreensPan
    非常感谢你的帮助,我也怀疑是你说的这个原因,没有分配足够的空间。
    可是,我按照你说的修改以后,编译时候居然出来这个错误Write Error 
    on 'H:\Delphi\SNMP\Unit1.dcu',注释掉snmpget函数调用那一句就没有
    这个错误,怎么回事?如果你不忙的话,我把那个Dll发给你,还有VC下的函数接口,你帮我看看?
      

  10.   

    非常感谢各位的帮助,终于搞定了.
    函数是这样定义的:
    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;