rt

解决方案 »

  1.   

    ls,引用之后,代码这样的
         CooMonitor monitor = new CooMonitor();
               monitor.Port = 3000;
               //注册DeviceConnected事件
                monitor.DeviceConnected += new _ICooMonitorEvents_DeviceConnectedEventHandler(test.FDeviceConnected);
               monitor.AppVerQueryResult += new _ICooMonitorEvents_AppVerQueryResultEventHandler(test.queryapp);
                monitor.Startup();//启动服务器    
              while(condition)
                {
                   
                }
                Console.WriteLine("{0}", monitor.GetPanelType(pstrMac));//这一步都可以正确调用
                QueryAppVersion(pstrMac);//程序在这一步出错。调试时发现溢出了。
      

  2.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    using IPModuleLib;
    using System.Runtime.InteropServices;
    //控制台的test程序namespace HoneyWell
    {
        class Program
        {  static public CooMonitor monitor = new CooMonitorClass();
    //CooMonitor,activex提供的接口
           static public Program test = new Program();
           static public bool condition = true;
           static public string pstrMac;
           static public int count=0;
            public void FDeviceConnected(string Mac)//只要有设备连接过来就响应
            {
                Console.WriteLine("FDeviceConnected,mac is :{0}", Mac);
                pstrMac = Mac;
                count++;
                if (count == 1)
                    condition = false;
               }        public void queryapp(string strMac, int lSuccess, string strAppVer)//按照说明书,执行查询版本函数后,结果会通过事件上报
            {
                Console.WriteLine("FDeviceConnected,mac is :{0}", strAppVer);
                
            }              
            static void Main(string[] args)
            {
                
                monitor.Port = 3000;//定义设备链接过来的相应端口
                monitor.DeviceConnected += new _ICooMonitorEvents_DeviceConnectedEventHandler(test.FDeviceConnected); //注册DeviceConnected事件
         
              monitor.AppVerQueryResult += new _ICooMonitorEvents_AppVerQueryResultEventHandler(test.queryapp);//注册查询版本事件
                monitor.Startup();//启动服务器    ,开始监听是不是有设备连接
              while(condition)
                {
                   //当设备连接后,响应DeviceConnected事件,condition变为false,跳出循环
                }
               Console.WriteLine("{0}", monitor.GetPanelType(pstrMac));//获取连接过来的设备类型,该函数直接返回数据,可以正常执行
               monitor.QueryAppVersion(pstrMac);//这一步就溢出了,调试显示企图访问0xfffffffc的数据
        
                for (; ; )
                {
                    
                }
            }
        }
    }
      

  3.   

    把这个Activex添加到控件栏中,然后添加到你的程序里,之后通过这个控件名就能调用附带的方法
      

  4.   

    你调用DLL
    然后写成类
    然后在调用
      

  5.   

    monitor.QueryAppVersion(pstrMac);
    看看这个函数做了什么操作,是不是要传入StringBuilder类型的数据呢?
      

  6.   

    就是传入一个string类型的数据,表示mac地址
      

  7.   


    而且我发现一个细节,下断点单步跟踪,monitor.QueryAppVersion(pstrMac)在执行后不会马上出错,而是继续执行了一直两行数据才报错(执行的这一两行肯定没有错误的)
      

  8.   


    你调试的是QueryAppVersion()里的代码?贴出来看看吧;
      

  9.   

    见笑了,才学会用vs2005还不知道在调试时怎么看内存和寄存器。

                monitor.QueryAppVersion(pstrMac);
    000000f8  mov         ecx,dword ptr ds:[022C7444h] 
    000000fe  mov         edx,dword ptr ds:[022C744Ch] //这里是得到pstrmac的数据,这步没有错误,之前的函数也是这么调用的,但是可以成功。
    00000104  call        dword ptr ds:[0099002Ch] 
    0000010a  nop              】这个图片是报错的地方,溢出了(我不知道是不是在函数QueryAppVersion内,估计是。),因为今天才想到用vs2005反汇编,以前一直用vc6.0
      

  10.   

    看不到图片,用下try...catch,把错误的堆栈保存为一个文件,看看吧;
      

  11.   

    莫法,根本走不到catch那里去图片内容是:
    10009F9D  int         3    
    10009F9E  int         3    
    10009F9F  int         3    
    10009FA0  push        esi  
    10009FA1  mov         esi,ecx 
    10009FA3  mov         eax,dword ptr [esi+4] 
    10009FA6  sub         eax,10h 
    10009FA9  lea         ecx,[eax+0Ch] 
    10009FAC  or          edx,0FFFFFFFFh 
    10009FAF  lock xadd   dword ptr [ecx],edx  //中断在了这里,报错!!!
    10009FB3  dec         edx  
    10009FB4  test        edx,edx 
    10009FB6  jg          10009FC2 
    10009FB8  mov         ecx,dword ptr [eax] 
    10009FBA  mov         edx,dword ptr [ecx] 
    10009FBC  push        eax  
    10009FBD  mov         eax,dword ptr [edx+4] 
    10009FC0  call        eax  
    10009FC2  mov         eax,dword ptr [esi] 
    10009FC4  sub         eax,10h 
    10009FC7  lea         ecx,[eax+0Ch] 
    10009FCA  or          edx,0FFFFFFFFh 
    10009FCD  lock xadd   dword ptr [ecx],edx 
    10009FD1  dec         edx  
    10009FD2  test        edx,edx 
    10009FD4  jg          10009FE0 
    10009FD6  mov         ecx,dword ptr [eax] 
    10009FD8  mov         edx,dword ptr [ecx] 
    10009FDA  push        eax  
    10009FDB  mov         eax,dword ptr [edx+4] 
      

  12.   

    edx =FFFFFFFF
    ecx =FFFFFFFD用[ecx]表示取FFFFFFFD地方的数据,肯定越界了 
      

  13.   

    走不到catch去,则说明是底层的问题,要么你传入的数据格式不对(一个控件应该有能力处理这种错误的),要么是控件写的有问题;
      

  14.   


    我也觉得啊。
    但是用activex控件检测容器是没有问题的,6楼的朋友说的也可以执行。
      

  15.   

    我跟踪了一下,发现10009FA3  mov        eax,dword ptr [esi+4] 这一句里,eax的值=null