c# 调用C++ 结构体指针的问题: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏

2025-02-24 15:58:35
推荐回答(2个)
回答1:

我用你的代码验证了一下我的猜测。

有两处错误

1 c++的dll 方法:int GetVehiclesInfo(VehicleInfo *pVehicle, int size);

参数是指针数组 应该使用 VehicleInfo **pVehicle

所以应该为int GetVehiclesInfo(VehicleInfo **pVehicle, int size);

DLL中的方法 为了测试加了一个MessageBoxA

VEC_API int GetVehiclesInfo(VehicleInfo **pVehicle, int size)

{

for(int i =0;i

{

pVehicle[i]->vehicle_name[0]='H';

pVehicle[i]->vehicle_name[1]='A';

pVehicle[i]->vehicle_name[2]='U';

pVehicle[i]->vehicle_name[3]='0';

pVehicle[i]->vehicle_name[4]='9';

pVehicle[i]->vehicle_name[5]='8';

pVehicle[i]->idx=1;

pVehicle[i]->vehicle_rtsp[0]='1';

pVehicle[i]->vehicle_rtsp[1]='2';

}

string s(pVehicle[0]->vehicle_rtsp);

MessageBoxA(NULL,pVehicle[0]->vehicle_name,"pVehicle[0]的车牌号码是",0); 

return 0;

}


2 c#

record[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(BwsPtzManager.VehicleInfo)) * isize);


像这样分配地址是不对的 ,这样只是给record[0] 分配了  record[size] 长度地址空间

而并没有给 record[1]~ record[size-1]分配空间

所以应该为

 IntPtr[] record = new IntPtr[isize]; //申请内存空间

 for (int i = 0; i < isize; i++)

 {

       record[i] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VehicleInfo)));

 } 

按钮事件:

 private void button1_Click(object sender, EventArgs e)

        {

            int isize=5;

            IntPtr[] record = new IntPtr[isize]; //申请内存空间

            for (int i = 0; i < isize; i++)

            {

                record[i] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VehicleInfo)));

            }

            int realcount = GetVehiclesInfo(record, isize);

            for (int i = 0; i < realcount; i++)

            {

                VehicleInfo vehinfo = new VehicleInfo();

                vehinfo = (VehicleInfo)Marshal.PtrToStructure((IntPtr)((UInt32)record[i]), typeof(VehicleInfo));

                Marshal.FreeHGlobal(record[i]);

            }

        }

        [DllImport("vec.dll", CallingConvention = CallingConvention.Cdecl)]

        public unsafe static extern int GetVehiclesInfo(  IntPtr[] p, int size); 

回答2:

你只申请了record[0]的空间,1~isize的空间没有申请,使用使为默认值(null)肯定出问题了