hello everyone. I am using shapeeditor to draw some  types as points, polylines, polygons on my map. When using current zoom small  less level 9, my map run common, however, when I zoom it up to larger than 10, I assign mouse to cmAddShape
(ex: axMap.CursorMode = tkCursorMode.cmNone;     axMap.CursorMode = CursorMode.cmAddShape;). My program occurs error following: “System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt”. I can’t found why it happended.
Please recommend me some idea to fix it.
Thanks a lot.
Hello @tiennguyen
- What version of the OCX are you using?
 - Could you post more specific code? Then we may be able to diagnose or reproduce the problem.
 
Thank you.
Jerry.
thanks for your answer. I am using MapWinGis 5.1.1 and my code write as follow:
try
{
Shapefile sf = axMap.get_Shapefile(idLayHndPoint);
if (sf == null)
return;
            if (axMap.CursorMode != tkCursorMode.cmAddShape)
            {
                
                sf.InteractiveEditing = true; 
                drawLayer = (int)clsConst.ENUM_DRAW_LAYER.SHP_POINT;
                axMap.CursorMode = tkCursorMode.cmNone;
                axMap.CursorMode = tkCursorMode.cmAddShape;
                GlobVar.mouseFlag = GlobVar.MOUSE_FLAG.MOUSE_DRAW_POINT;                    
                addPoint.Checked = true;
                addPolyline.Enabled = false;
                addPolygon.Enabled = false;
                addCircle.Enabled = false;
                editShape.Enabled = false; 
                //addPolyline.Checked = false;
                //addPolygon.Checked = false;
                //addCircle.Checked = false;
                ZoomInLevel.Checked = false;
                ZoomOutLevel.Checked = false;
                MeasureBtn.Checked = false;
                MeasureAreaBtn.Checked = false;
                editShape.Checked = false;
            }
            else
            {
                drawLayer = (int)clsConst.ENUM_DRAW_LAYER.NONE;
                axMap.CursorMode = tkCursorMode.cmNone;
                GlobVar.mouseFlag = GlobVar.MOUSE_FLAG.MOUSE_NONE;
               // sf.Close();                     
               // axMap.ShapeEditor.RawData.Clear(); 
                addPoint.Checked = false;
                addPolyline.Enabled = true;
                addPolygon.Enabled = true;
                addCircle.Enabled = true;
                editShape.Enabled = true; 
            }
        }
        catch (Exception ex)
        {
            clsCommon.glogError.Fatal(ex.ToString()); 
            throw;
        }
    }
File shapefile is created in advance and choose layer was written as follow:
try
{
//1. Add shape operation
if (axMap.CursorMode == tkCursorMode.cmAddShape)
{
if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.NONE)        // return
return;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.WARFARE_AREA)
e.layerHandle = idLayHndWFArea;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.GEO_AREA)
e.layerHandle = idLayHndGeoArea;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.SEA_AREA)
e.layerHandle = idLayHndSeaArea;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.AIR_AREA)
e.layerHandle = idLayHndAirArea;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.SHP_POINT)
e.layerHandle = idLayHndPoint;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.SHP_POLYLINE)
e.layerHandle = idLayHndPolyline;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.SHP_POLYGON)
e.layerHandle = idLayHndPolygon;
}
//2. select object by cmSelection
if (axMap.CursorMode == tkCursorMode.cmMoveShapes)
{
e.layerHandle = idLayHndWFArea;
}
//if (axMap.CursorMode == tkCursorMode.cmEditShape)
//{
            //    e.layerHandle = idLayHndCircle; 
            //    double tmpLat = e.yProj;
            //    double tmpLon = e.xProj; 
            //}
        }
        catch (Exception ex)
        {
            clsCommon.glogError.Fatal(ex.ToString()); 
            throw;
        }
            Hi. I think you do not understand my explanation. Please allow me explain it again for you. I hope you might tell me some idea to repair it.
Target:
I am using some advantages of shapeEditor class to draw something, in which I assign axMap.CursorMode = cmAddShape to draw points, polylines, polygons and all of them is saved into shapefile.
Implementation:
To implement it I wore code as follow:
step1: I create some shapefile (.shp) to save. This function was called in Load of my application.
            LoadShpGeoFile(ref sfPoint, "sf_Points.shp", ref idLayHndPoint);
            LoadShpGeoFile(ref sfPolyline, "sf_Polyline.shp", ref idLayHndPolyline);
            LoadShpGeoFile(ref sfPolygon, "sf_Polygons.shp", ref idLayHndPolygon);
            LoadShpGeoFile(ref sfCircle, "sf_Circles.shp", ref idLayHndCircle);
In each LoadShpGeoFile(), I create a file  .shp with type point, polygon, polyline respectively. Furthermore I  configure options for file, for instance, color, linewidth, … . Finnally I add .shp file to map and save index of layerHandle which return by function AddLayer () ( to use for step 3). you can see attacted file.
Step2: When user select a button on toolbar, I set flag for mouse:
private void addPoint_Click(object sender, EventArgs e)
{
try
{
Shapefile sf = axMap.get_Shapefile(idLayHndPoint);
if (sf == null)
return;
            if (axMap.CursorMode != tkCursorMode.cmAddShape)
            {
                
                sf.InteractiveEditing = true; 
                drawLayer = (int)clsConst.ENUM_DRAW_LAYER.SHP_POINT;
                axMap.CursorMode = tkCursorMode.cmNone;
                axMap.CursorMode = tkCursorMode.cmAddShape;
                GlobVar.mouseFlag = GlobVar.MOUSE_FLAG.MOUSE_DRAW_POINT;                    
                addPoint.Checked = true;
                addPolyline.Enabled = false;
                addPolygon.Enabled = false;
                addCircle.Enabled = false;
                editShape.Enabled = false; 
                //addPolyline.Checked = false;
                //addPolygon.Checked = false;
                //addCircle.Checked = false;
                ZoomInLevel.Checked = false;
                ZoomOutLevel.Checked = false;
                MeasureBtn.Checked = false;
                MeasureAreaBtn.Checked = false;
                editShape.Checked = false;
            }
            else
            {
                drawLayer = (int)clsConst.ENUM_DRAW_LAYER.NONE;
                axMap.CursorMode = tkCursorMode.cmNone;
                GlobVar.mouseFlag = GlobVar.MOUSE_FLAG.MOUSE_NONE;
               // sf.Close();                     
               // axMap.ShapeEditor.RawData.Clear(); 
                addPoint.Checked = false;
                addPolyline.Enabled = true;
                addPolygon.Enabled = true;
                addCircle.Enabled = true;
                editShape.Enabled = true; 
            }
        }
        catch (Exception ex)
        {
            clsCommon.glogError.Fatal(ex.ToString());
            MessageBox.Show(ex.ToString()); 
            throw;
        }
    }
Step3: In ChooseLayer Event, I only assign e.LayerHandle = id which save in step1.
try
{
//1. Add shape operation
if (axMap.CursorMode == tkCursorMode.cmAddShape)
{
if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.NONE)        // return
return;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.WARFARE_AREA)
e.layerHandle = idLayHndWFArea;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.GEO_AREA)
e.layerHandle = idLayHndGeoArea;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.SEA_AREA)
e.layerHandle = idLayHndSeaArea;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.AIR_AREA)
e.layerHandle = idLayHndAirArea;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.SHP_POINT)
e.layerHandle = idLayHndPoint;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.SHP_POLYLINE)
e.layerHandle = idLayHndPolyline;
else if (drawLayer == (int)clsConst.ENUM_DRAW_LAYER.SHP_POLYGON)
e.layerHandle = idLayHndPolygon;
else
e.layerHandle = idLay;
}
//2. select object by cmSelection
if (axMap.CursorMode == tkCursorMode.cmMoveShapes)
{
e.layerHandle = idLayHndWFArea;
}
//if (axMap.CursorMode == tkCursorMode.cmEditShape)
//{
            //    e.layerHandle = idLayHndCircle; 
            //    double tmpLat = e.yProj;
            //    double tmpLon = e.xProj; 
            //}
        }
        catch (Exception ex)
        {
            clsCommon.glogError.Fatal(ex.ToString());
            MessageBox.Show(ex.ToString()); 
            throw;
        }
        
    }
My problem:
when my application zoom map not upto 9 level (current zoom <=9) , i choose cmAddShape to draw,  it operate perfectly. However, when I zoom map over 10 and i choose mouse mode to draw point, polyline, polygon by cmAddShape. It occurs an error which try {} catch of c# not capture it.
[“System.AccessViolationException: ‘Attempted to read or write protected memory. This is often an indication that other memory is corrupt”]. Furthermore, in output window of visual studio 2017 enterprise, I see a report that content:
Exception thrown at 0x775343D2 in C2Console.exe: Microsoft C++ exception: geos::util::IllegalArgumentException at memory location 0x00AFDDF4.
Exception thrown at 0x775343D2 in C2Console.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
Exception thrown at 0x60C6DD25 (geos_c.dll) in C2Console.exe: 0xC0000005: Access violation reading location 0x00000000.
Exception thrown: ‘System.AccessViolationException’ in System.Windows.Forms.dll
I really have not found a method to solve it.
Can you help me?
Thans a lot. myCode.zip (2.7 KB)
hj jeryfaust.
Can you help me?
Hello @tiennguyen
I would like to help you if I can. I don’t see anything after initial review. Instead, I would have to reproduce the problem by running the code, to see where the exception is occurring (in the OCX). But to do that, I need a complete application. There are too many missing pieces in the code sample you sent.
Is it possible to create a smaller (scaled down) sample program that reproduces the problem, and send me the code for that? I can then debug the OCX and hopefully find the exception.
Thank you,
Jerry.