'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 |
|---|
