'Visual Stuido C# Access Violation while Using Anviz SDK

I am trying to use "Anviz Original SDK" i added simple looping to connect multiple devices. it was running okay if i only run it for 1 times, but in the second (sometimes the third) it keep crashing and showing erorr "Access Violation" at the output box of Visual Studio.

I've read some posts here on stackoverflow which suggest that there might be a bad pointer somewhere, but i cannot find where. I think My pointers are not corrupt.

The DLL Import for the function are using this code:

[DllImport("tc-b_new_sdk.dll")]

here is the function to loop and connect to device:

private void pictureBox3_Click(object sender, EventArgs e)
    {

        foreach (ListViewItem item in listViewDevice.Items)
        {
            
            if (item.Selected)
            {
                //int result = connectDevice(item.SubItems[3].Text, "5010");
                int ret = 0;
                byte[] Ipstr = new byte[16];
                //string_to_byte(this.Add_dev_Ip.Text,Ipstr, (byte)Add_dev_Ip.Text.Length);
                Ipstr = System.Text.Encoding.Default.GetBytes(item.SubItems[3].Text);
                int Port = Convert.ToInt32("5010");

                ret = AnvizNew.CCHex_ClientConnect(anviz_handle, Ipstr, Port);

            }
        }
    }

and here is the Timer Tick function to get the data:

    private void timer1_Tick(object sender, EventArgs e)
    {
        try
        {
            int ret = 0;
            int[] Type = new int[1];
            int[] dev_idx = new int[1];
            IntPtr pBuff;
            int len = 32000;

            pBuff = Marshal.AllocHGlobal(len);
            while (true)
            {
                if (anviz_handle == IntPtr.Zero)
                {
                    break;
                }


                ret = AnvizNew.CChex_Update(anviz_handle, dev_idx, Type, pBuff, len);
                //dbg_info("Update~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
                if (ret > 0)
                {
                    dbg_info("Msg Type : " + Type[0]);
                    switch (Type[0])
                    {
                        case (int)AnvizNew.MsgType.CCHEX_RET_DEV_LOGIN_TYPE:
                            {
                                AnvizNew.CCHEX_RET_DEV_LOGIN_STRU dev_info;
                                dev_info = (AnvizNew.CCHEX_RET_DEV_LOGIN_STRU)Marshal.PtrToStructure(pBuff, typeof(AnvizNew.CCHEX_RET_DEV_LOGIN_STRU));
                                string info_buff = "Dev Login --- [MachineId:" + dev_info.MachineId
                                    + " Version:" + byte_to_string(dev_info.Version)
                                    + " DevType:" + byte_to_string(dev_info.DevType)
                                    + " Addr:" + byte_to_string(dev_info.Addr)
                                    + "]";
                                //log_add_string(info_buff + "    " + dev_info.DevTypeFlag.ToString());
                                log_add_string(info_buff + "    " + Convert.ToString(dev_info.DevTypeFlag, 16));
                                ListViewItem foundItem = null;
                                if (foundItem == null)//just  test  has   machineid  
                                {
                                    int i = 0;
                                    for (i = 0; i < listViewDevice.Items.Count; i++)
                                    {
                                        foundItem = this.listViewDevice.Items[i];
                                        if (foundItem.SubItems[1].Text.ToString() == dev_info.MachineId.ToString() && Convert.ToInt32(foundItem.Text.ToString()) != dev_info.DevIdx)
                                        {
                                            foundItem.Text = dev_info.DevIdx.ToString();
                                            break;
                                        }
                                        else
                                        {
                                        }
                                        //foundItem.Text = dev_info.DevIdx.ToString();
                                        foundItem = null;
                                    }
                                }
                                DevCount++;
                                //DevTypeFlag.Add(dev_info.DevIdx, (int)dev_info.DevTypeFlag);
                            }
                            break;
                        case (int)AnvizNew.MsgType.CCHEX_RET_DEV_LOGIN_CHANGE_TYPE:
                            {
                                AnvizNew.CCHEX_RET_DEV_LOGIN_STRU dev_info;
                                dev_info = (AnvizNew.CCHEX_RET_DEV_LOGIN_STRU)Marshal.PtrToStructure(pBuff, typeof(AnvizNew.CCHEX_RET_DEV_LOGIN_STRU));
                                string info_buff = "Login Change --- [MachineId:" + dev_info.MachineId
                                    + " Version:" + byte_to_string(dev_info.Version)
                                    + " DevType:" + byte_to_string(dev_info.DevType)
                                    + " Addr:" + byte_to_string(dev_info.Addr)
                                    + "]";
                                log_add_string(info_buff + "    " + Convert.ToString(dev_info.DevTypeFlag, 16));
                                //log_add_string(info_buff + "    " + dev_info.DevTypeFlag.ToString());
                                //DevTypeFlag[dev_info.DevIdx] = (int)dev_info.DevTypeFlag;
                            }
                            break;
                        case (int)AnvizNew.MsgType.CCHEX_RET_DEV_LOGOUT_TYPE:
                            {
                                AnvizNew.CCHEX_RET_DEV_LOGOUT_STRU dev_info;
                                dev_info = (AnvizNew.CCHEX_RET_DEV_LOGOUT_STRU)Marshal.PtrToStructure(pBuff, typeof(AnvizNew.CCHEX_RET_DEV_LOGOUT_STRU));
                                string info_buff = "Dev Logout --- [MachineId:" + dev_info.MachineId
                                + " Version:" + byte_to_string(dev_info.Version)
                                + " DevType:" + byte_to_string(dev_info.DevType)
                                + " Live:" + dev_info.Live
                                + " Addr:" + byte_to_string(dev_info.Addr)
                                + "]";

                                log_add_string(info_buff);
                                DevCount--;
                                ListViewItem foundItem = null;
                                if (foundItem == null)//just  test  has   machineid  
                                {
                                    int i = 0;
                                    for (i = 0; i < listViewDevice.Items.Count; i++)
                                    {
                                        foundItem = this.listViewDevice.Items[i];
                                        if (foundItem.SubItems[1].Text.ToString() == dev_info.MachineId.ToString() && Convert.ToInt32(foundItem.Text.ToString()) == dev_info.DevIdx)
                                        {
                                            break;
                                        }
                                        foundItem = null;
                                    }
                                }
                                //ListViewItem foundItem = this.listViewDevice.FindItemWithText(dev_info.MachineId.ToString(), false, 0);
                                if (foundItem != null)
                                {
                                   // DevTypeFlag.Remove(dev_idx[0]);
                                    foundItem.Text = "0";
                                    //this.listViewDevice.Items.Remove(foundItem);
                                }

                            }
                            break;
                    }
                }
                else if (0 == ret)
                {
                    //MY_SLEEP(10);
                    //Marshal.FreeHGlobal(pBuff); // free the memory  
                    break;
                }
                else if (0 > ret)
                {
                    //buff to small
                    len = len * 2;
                    Marshal.FreeHGlobal(pBuff);
                    pBuff = Marshal.AllocHGlobal(len);
                }
                else
                {
                    //没有找到消息类型
                    //Marshal.FreeHGlobal(pBuff); // free the memory  
                    break;
                }
                //Marshal.FreeHGlobal(pBuff); // free the memory  
            }
            //Marshal.FreeHGlobal(buff_fin);
            Marshal.FreeHGlobal(pBuff); // free the memory  
        }
        catch (Exception ex)
        {
            dbg_info("Error " + ex.Message);
        }

    }

Really appreciate for any helps. Thanks.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source