程序编译可通过,可一点"连接设备"等按钮,就出现存取地址违例,提示:Project t1.exe raised exception class EAccessviolation with message '存取地址 10002EBD违例发生在模块'EtesnMMS.ocx'中,读在地址00000004里',Process stopped.use step or run to continue.
请问一般是什么原因造成这些的?这个控件在vc下没有任何问题,因为我对delphi很不熟悉,很简单的弄了一下,请大家看一下有哪些可以会造成这个问题.谢谢.
ps:复制出来是乱码,所以showmessage中的信息删除掉了.unit ocx6;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, ETESNMMSLib_TLB, StdCtrls;type
  TForm1 = class(TForm)
    Exit: TButton;
    InitModel: TButton;
    SendSMS: TButton;
    SendMMS: TButton;
    DisConnectModem: TButton;
    ConnectModem: TButton;
    EtesnMMS1: TEtesnMMS;
    procedure InitModelClick(Sender: TObject);
    procedure ConnectModemClick(Sender: TObject);
    procedure DisConnectModemClick(Sender: TObject);
    procedure SendMMSClick(Sender: TObject);
    procedure SendSMSClick(Sender: TObject);
    procedure ExitClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation
{$R *.dfm}procedure TForm1.InitModelClick(Sender: TObject);
//
var nRes:integer;
begin
  nRes:=EtesnMMS1.InitModel('C:\RecvMMS',7,1,101,1);
  if(nRes>0)
     then
       showMessage('!')
       else if(nRes=0)
         then ShowMessage('³!')
       else if(nRes=-4)
          then ShowMessage('!')
end;
procedure TForm1.ConnectModemClick(Sender: TObject);
//
var
  nRes:integer;
begin
  nRes:=EtesnMMS1.ConnectModem('com1');
  if (nRes=1)
     then showmessage('')
      else if (nRes=-1)
         then showmessage('')end;procedure TForm1.DisConnectModemClick(Sender: TObject);
//
begin
  EtesnMMS1.DisConnectModem;
  showmessage('');
end;procedure TForm1.SendMMSClick(Sender: TObject);
//
 var
   nRes,m_nSendMsgIndex:integer;
   m_strSendNumber,m_strMMSTitle,m_strMMSRes:string;
begin
  nRes:=EtesnMMS1.SendMMS(m_strSendNumber,m_strMMSTitle,m_strMMSRes,m_nSendMsgIndex);  if (nRes=1)
    then showmessage('')
    else if(nRes=-1)
         then showmessage('')
         else if(nRes=-2)
              then showmessage('')
              else if(nRes=-3)
                   then showmessage('')
                   else if(nRes=-4)
                        then showmessage('')
                        else if(nRes=-5)
                             then showmessage('')
end;procedure TForm1.SendSMSClick(Sender: TObject);
//
var
  nRes,m_nSendMsgIndex:integer;
  strSendNumber,strSmsContent:string;
begin
  nRes:=EtesnMMS1.SendSMS(strSendNumber,strSmsContent,m_nSendMsgIndex);
  if(nRes=1)
     then showmessage('')
     else if(nRes=-1)
          then showmessage('')
          else if(nRes=-2)
               then showmessage('')
               else if(nRes=-3)
                    then showmessage('')end;procedure TForm1.ExitClick(Sender: TObject);
//
begin
  close;
end;procedure TForm1.FormCreate(Sender: TObject);
beginend;end.

解决方案 »

  1.   

    没用过这控件。按楼主的意思看,问题应该出在这?
    procedure TForm1.ConnectModemClick(Sender: TObject);
    //
    var
      nRes:integer;
    begin
      nRes:=EtesnMMS1.ConnectModem('com1');//估计是这一行报错
      if (nRes=1)
         then showmessage('')
          else if (nRes=-1)
             then showmessage('')end;
    先看下EtesnMMS1有没有创建,再看看EtesnMMS1中有没有需要创建的对象,比如指针或者属性等
    不知道能不能帮上忙……
      

  2.   

    谢谢您的回复。我也怀疑是那一句的问题。可参数类型如果错误的话,delphi会提示的呀。那一条语句类型至少没错。控件地址:www.edi-son.com/download/tmp/etesnmms.ocx
    如果您有时间帮我看一下。谢谢。
      

  3.   

    EtesnMMS1.InitModel('C:\RecvMMS',7,1,101,1)成功了吗,返回值是多少?
      

  4.   

    你的代码中没有看到明显的错误。估计是OCX中进行了错误的操作。可能你需要加查一下你的参数设置是否正确。
      

  5.   

    EtesnMMS1.InitModel('C:\RecvMMS',7,1,101,1)中,我在delphi看了一下,第一个参数是widestring,其余全是整型,所以好象我的参数没有什么问题。。在编译后,只有点连接设备,即connectmodem和退出exit不会出错,全他全会出错。按道理,断开设备,即disconnectmodem不会出错呀,就只调用了一个函数。这个ocx控件是多线程的,是vc编的,在vc下调用不会有问题。我都不知道是控件的原因,还是我程序的原因了,请问我的程序有什么问题吗?谢谢。