2014-04-11 2 views
0

간단한 SNMP 응용 프로그램을 작성하여 comtech 모뎀 CDM-570L (예 : 시스템 암호 해독, 전원 수준 및 기호 속도)에서 정보를 가져옵니다.액세스 위반 오류 SNMP

unit Unit1; 

interface 

uses 
    System.UITypes, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, IdUDPBase, IdUDPClient, idSNMP; 

type 
    TForm1 = class(TForm) 
     Nhap: TGroupBox; 
     Label1: TLabel; 
     Label2: TLabel; 
     ButtonEnter: TButton; 
     Xuat: TGroupBox; 
     PowerLevel: TLabel; 
    PowerLevelValue: TEdit; 
     SymbolRate: TLabel; 
    SymbolRateValue: TEdit; 
     ButtonSave: TButton; 
     dBm: TLabel; 
     sps: TLabel; 
     DeviceName: TLabel; 
    HostIP: TEdit; 
    ComString: TEdit; 
    procedure BtnEnterClick(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 
    SNMP: TidSNMP; 
implementation 

{$R *.dfm} 

procedure TForm1.BtnEnterClick(Sender: TObject); 
var dn, OID: string; //dn = device name, I mean system descryption 

begin 
    if Trim(HostIP.Text) = '' then begin 
    MessageDlg('Chưa nhập IP của thiết bị!', mtError, [mbOK], 0); 
    Exit; 
    end; 
    if Trim(ComString.Text) = '' then begin 
    MessageDlg('Chưa nhập SNMP read community string', mtError, [mbOK], 0); 
    Exit; 
    end; 
    PowerLevelValue.Clear; 
    SymbolRateValue.Clear; 
    SNMP.Host:= HostIP.Text; 
    SNMP.Community:= ComString.Text; 
    SNMP.ReceiveTimeout:=1000; 
    if SNMP.QuickSend('1.3.6.1.2.1.1.1.0',SNMP.Community,SNMP.Host,dn) 
    then DeviceName.Caption:=dn; 
end; 

end. 

오류가 발생했습니다

첫 번째 예외를 $ 005D39C9에서. 예외 클래스 $ C0000005 '0x005d39c9에서 액세스 위반 : 0x00000000 읽기'메시지가 있습니다. 프로세스 만들기 Project1.exe (8156)

enter image description here

~~ 내 첫 번째 게시물은 여기에, 감사 ~~ 읽기

편집을 위해 : 죄송합니다 "경우"나는

을 편집 잊지 않았다
SNMP.QuickSend('1.3.6.1.2.1.1.1.0',SNMP.Community,SNMP.Host,dn); 
DeviceName.Caption:=dn; 
+0

나중에 참조 할 수 있도록 디버거를 사용하여 예외를 트리거하는 행을 찾아내어 해당 세부 정보를 질문에 포함하십시오. –

답변

1

SNMP 전역 변수는 선언되었지만 할당되지 않았습니다. 따라서 nil입니다. 이를 참조하려고하면 액세스 위반이 발생합니다. 객체를 사용하기 전에 객체를 인스턴스화해야합니다.

더 광범위하게 여기 왜 글로벌 변수를 사용하는지 궁금합니다. 일반적으로 전역 변수는 피해야합니다.

+0

감사합니다. 작동합니다! 그냥 추가 Snmp : = TIdSNMP.Create (nil)); –

+0

오, 내가 당신의 대답을 편집 할 수 있습니다, 이것은 어리석은 괴물입니다! –