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事件
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);//程序在这一步出错。调试时发现溢出了。
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 (; ; )
{
}
}
}
}
然后写成类
然后在调用
看看这个函数做了什么操作,是不是要传入StringBuilder类型的数据呢?
而且我发现一个细节,下断点单步跟踪,monitor.QueryAppVersion(pstrMac)在执行后不会马上出错,而是继续执行了一直两行数据才报错(执行的这一两行肯定没有错误的)
你调试的是QueryAppVersion()里的代码?贴出来看看吧;
【
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
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]
ecx =FFFFFFFD用[ecx]表示取FFFFFFFD地方的数据,肯定越界了
我也觉得啊。
但是用activex控件检测容器是没有问题的,6楼的朋友说的也可以执行。