由指针得到结构体数据的问题,请高手指点
我调用第三方的dll来读取设备中的设置,第三方dll中的方法要我给出数据缓冲区地址,和缓冲区长度。执行后,确无法从该缓冲区中取得任何数据,请问原因及处理办法。代码如下:
- C# code
public override int GetServerNTP(IntPtr hDev, ref string NTPUrl, ref int timezone, ref bool enable, ref int reserve) { DVSNETClient.DVSNET_NTP_PARAM ntp = new DVSNETClient.DVSNET_NTP_PARAM(); IntPtr pntp = Marshal.AllocHGlobal(Marshal.SizeOf(ntp)); //Marshal.StructureToPtr(ntp, pntp, true); //IntPtr pntp = IntPtr.Zero; uint len = (uint)Marshal.SizeOf(new DVSNETClient.DVSNET_NTP_PARAM()); int r = GetServerParam(hDev, (uint)(0x10000 + 224), 0,ref pntp, len); DVSNETClient.DVSNET_NTP_PARAM ntp = (DVSNETClient.DVSNET_NTP_PARAM)Marshal.PtrToStructure(pntp, typeof(DVSNETClient.DVSNET_NTP_PARAM)); NTPUrl = new string(ntp.strNTPUrl); timezone = (int)ntp.nTimeZone; enable = ntp.bEnabled == 1 ? true : false; reserve = (int)ntp.dwReserve; return r; }
[解决办法]
断点调试下,看看r是多少
[解决办法]
IntPtr pntp = Marshal.AllocHGlobal(Marshal.SizeOf(ntp));
//Marshal.StructureToPtr(ntp, pntp, true);
//IntPtr pntp = IntPtr.Zero;
uint len = (uint)Marshal.SizeOf(new DVSNETClient.DVSNET_NTP_PARAM());
int r = GetServerParam(hDev, (uint)(0x10000 + 224), 0,ref pntp, len);//这句话有问题
如果用ref intptr 的话,c++相当于** , 意思是这个地址,是由dll方面创建....
改成intptr 试试,另外看看c++如何调用的?
[解决办法]
oletime 在你的C# 里怎么转的?