做一个监控程序
连接两台设备,设备的IP地址,在界面的listview上显示,程序中,根据listView上的设备地址做初始化比如:
 192.168.7.100
 192.168.7.101
 代码如下:ListViewItem lv = new ListViewItem("192.168.7.100");
            lv.SubItems.Add("RFIDSCAN_TEST");
            lv.SubItems.Add("L70");
            lv.SubItems.Add("32");
            lv.SubItems.Add("Assembly Start");
            lv.SubItems.Add("Y");
            lv.SubItems.Add("");
            listView1.Items.Add(lv);
            ListViewItem lv2 = new ListViewItem("192.168.7.101");
            lv2.SubItems.Add("RFIDSCAN_TEST");
            lv2.SubItems.Add("L70");
            lv2.SubItems.Add("35");
            lv2.SubItems.Add("Assembly End");
            lv2.SubItems.Add("N");
            lv2.SubItems.Add("");
            listView1.Items.Add(lv2);
初始化的代码如下:
 意思,就是根据列表上地址个数,做初始化,连接成功,就加入列表,为下步工作做准备 if (listView1.Items.Count > 0)
                {
                    for (int i = 0; i < listView1.Items.Count; i++)
                    {
                        strReaderIP = listView1.Items[i].SubItems[0].Text;
                        if (Regex.IsMatch(strReaderIP, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"))
                        {
                           // RFIDParms rfidparms = new RFIDParms();
                            res = Reader2600.Net_ConnectScanner(ref m_hSocket, strReaderIP, nReaderPort, strHostIP, nHostPort);                            if (res == OK)
                            {
                                rfidparms.m_hSocket = m_hSocket;
                                rfidparms.res = OK;
                                rfidparms.strReaderIP = strReaderIP;
                                Lrfidparms.Add(rfidparms);                            }
}
初始化完成后,在定时器里做如下工作:
 if (Lrfidparms.Count() > 0)
                {
                    for (int f = 0; f < Lrfidparms.Count; f++)
                    {
                        bIsConnected = true;
                        nConnectMode = 1;
                        Read_times = 0;
                        k = 0;
                        
                        res = Reader2600.Net_EPC1G2_ReadLabelID(Lrfidparms[f].m_hSocket, mem, ptr, len, mask, IDBuffer, ref nCounter);  
 调用这个Net_EPC1G2_ReadLabelID函数时, 就抱如下异常:
“System.AccessViolationException: 尝试读取或写入受保护的内存”但这个异常出现的方式也很奇怪1、 当两台设备都连在网络上,且都处于工作状态时,,程序是正常的
2、 当两台设备,一台不在网络时,即不处于上电状态时,且listview不显示其IP地址时,即不做初始化
    剩下的一台设备,也可以正常工作3 ,但是,当两台设备,一台不在网络时,即不处于上电状态时,且listview显示其IP地址时,即做初始化
    剩下的一台设备,就无法正常工作  报上面对异常了
 很邪门,,,当两台设备中的一台不处于工作时,做如下动作
  res = Reader2600.Net_ConnectScanner(ref m_hSocket, strReaderIP, nReaderPort, strHostIP, nHostPort);                            if (res == OK)
                            {
                                rfidparms.m_hSocket = m_hSocket;
                                rfidparms.res = OK;
                                rfidparms.strReaderIP = strReaderIP;
                                Lrfidparms.Add(rfidparms);                            }
  断点看,是不把该句柄,加入列表里的,也就说,只有连接成功的句柄才被加入到列表里 按道理,,在做下步的操作,应该不影响的呀,,但是现在就是报异常 请指教
 

解决方案 »

  1.   

    Net_EPC1G2_ReadLabelID来自哪里,原型是什么,你的调用约定是否一致
      

  2.   

    Net_EPC1G2_ReadLabelID来自哪里,原型是什么,你的调用约定是否一致
      

  3.   


     .net里的声明:
     [DllImport("Reader2600DLL.dll")]
            public static extern int EPC1G2_ReadLabelID(int hScanner, int mem, int ptr, int len, byte[] mask, byte[] IDBuffer, ref int nCounter);        //C 原型:
    //apiReturn _stdcall EPC1G2_ReadWordBlock(HANDLE hScanner, BYTE EPC_WORD, BYTE *IDBuffer, BYTE mem, BYTE ptr, BYTE len, BYTE *Data, BYTE *AccessPassword);