关于C#使用C++嵌套结构体的问题.请教一下各位

langyue555 2015-04-30 11:11:32
最近做一个项目,要使用的C++的dll,遇到复杂结构的结构体,返回结果总是不对,请各位帮忙看看
C++的结构体:

typedef struct CMS_GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
}*LPCMS_GUID;
#endif
/**@brief 镜头列表节点结构 */
typedef struct CMS_NodeData
{
NODE_HANDLE hNode; /** 节点HANDLE */
int nNodeID; /** 节点ID */
int nNodeType; /** 节点类型 */
int nStatus; /** 节点状态 0 :禁用; 1: 可用*/
int bPTZ; /** 是否云台 */
int nPTZType; /** 云台类型 */
int nPTZAddr; /** 云台地址 */
CMS_GUID devGUID; /** 镜头GUID */
char cName[64]; /** 节点名称 */
char cDescribe[200]; /** 节点描述 */
}*LPCMS_NodeData;


我定义的C#结构体:

/// <summary>
/// 节点数据结构体
/// </summary>
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct CMS_NodeData
{
// 错误 8 “SAGA.VideoSurveillanceSystems.Client.Common.CMS_NodeData.DevGUID”: 标记为 StructLayout(LayoutKind.Explicit) 的实例字段类型必须具有 FieldOffset 特性 E:\昆明看守所监控\3实现\05Code\VideoSurveillanceSystems\SAGA.VideoSurveillanceSystems.Client.Common\Devices.cs 61 22 SAGA.VideoSurveillanceSystems.Client.Common

public IntPtr NodeHandle;
public int NodeID;
public int NodeType;
public int Status;
public int PTZ;
public int PTZType;
public int PTZAddr;
public LPCMS_GUID DevGUID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string NodeName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
public string NodeDescribe;

}
/// <summary>
/// 镜头GUID
/// </summary>
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct LPCMS_GUID
{
public uint Data1;
public UInt16 Data2;
public UInt16 Data3;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] Data4;


}

C++的函数定义:

/**@brief 得到第一个节点指针
* @param [IN] hServer 服务器句柄。
* @param [OUT] pData 节点数据结构指针,参见:LPCMS_NodeData。
* @return 返回如下错误码:
* #成功,NOZERO
* #失败,ZERO
* @note
*/
extern int __stdcall CMS_GetFirstNode(IN SERVER_HANDLE hServer,OUT LPCMS_NodeData pData);

C#的函数定义

[DllImport("CMS_ClientComm.dll", EntryPoint = "CMS_GetFirstNode", ExactSpelling = false, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int CMS_GetFirstNode(ref IntPtr hLID, ref CMS_NodeData pData);


这样调用:

public static List<CMS_NodeData> GetAllNode()
{
List<CMS_NodeData> lstNode = new List<CMS_NodeData>();

//获取第一个节点
CMS_NodeData firstData=new CMS_NodeData();
LPCMS_GUID guid =new LPCMS_GUID();
IntPtr prGuid = StructOP.StructToBytes(guid);
IntPtr pr = StructOP.StructToBytes(firstData);
firstData.DevGUID = guid;
int isSuccess = CMS_GetFirstNode(ref ServerInit.ServerHandle, ref firstData);
// uint temp = ServerInit.CMS_GetLastError();
//string eee = ErrorExport.Export(temp);
//循环获取所有节点
// firstData =(LPCMS_NodeData)Marshal.PtrToStructure(pr, typeof(LPCMS_NodeData));
return lstNode;
}

分配内存空间的方法:

internal static IntPtr StructToBytes(object obj)
{
try
{
//得到结构体的大小
int size = Marshal.SizeOf(obj);
//创建byte数组
// byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(obj, structPtr, false);
//从内存空间拷到byte数组
// Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return structPtr;
}
catch (Exception ex)
{
SAGA.Common.Log.Logger.Log(ex);
return IntPtr.Zero;
}
}

始终都显示不能得到对应的值,其中

方法始终都返回0
在线等......
...全文
246 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
langyue555 2015-04-30
  • 打赏
  • 举报
回复
自己拉一下,答案不好找啊
langyue555 2015-04-30
  • 打赏
  • 举报
回复
没有人遇到过吗 ?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧