首页 新闻 会员 周边

c# 如何使用结构体中指向另一结构体的指针?

0
悬赏园豆:10 [已关闭问题]

详细描述:

  主要是由C#调用DLL库造成的问题。 现有两个C#结构体,是从C语言中翻译过来的。

      第一个:

       [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct STATUS
        {
            public ushort fwDevice;
            public ushort fwMedia;
            public ushort fwRetainBin;
            public ushort fwSecurity;
            public ushort usCards;
            public ushort fwChipPower;
            [MarshalAsAttribute(UnmanagedType.LPStr)]
            public string lpszExtra;
        }

       第二个:

        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct  RESULT
        {
            public uint RequestID;
            public ushort hService;
            public int hResult;
            public int u;
            public IntPtr lpBuffer;    //指向第一个结构体的指针;
        }

   通过消息处理,我从WinForm的Message.LParam中获得了一个第二个结构体(RESULT
)的指针并将其转化为了RESULT的一个变量,通过这个变量可以正常访问其字段,唯有: “public IntPtr lpBuffer;   //指向第一个结构体(STATUS)的指针”使用失败,该如何定义和操作结构体才能正确使用该指针呢?

    请求各位高手指教啊!我郁闷一个上午了,都没有找到解决方法。
 

问题补充: 说明:我用WinForm窗体来接收C++编写的DLL发送过来的消息,DLL导出函数中将WinForm窗体句柄传给导出函数,其会将消息传送给WinForm。经测试证明:DLL传过来的消息Message.LParam指针可以转化为对应的结构体,就是该结构体内的指向另结构体的指针出错,不能转化为对于的结构体,但值有的。为什么呢?该如何解决这类问题?
苍岭飞龙的主页 苍岭飞龙 | 初学一级 | 园豆:0
提问于:2010-06-22 11:26
< >
分享
其他回答(2)
0

是用 Marshal.PtrToStructure()转换的吗?错误提示是什么?

eaglet | 园豆:17139 (专家六级) | 2010-06-22 11:55
是啊!代码: 其中Status为STATUS类型的结构体,Result为RESULT类型的结构体变量; Status = (STATUS)Marshal.PtrToStructure(Result.lpBuffer, typeof(STATUS)); 错误提示: 检测到FatalExecutionEngineError 运行时遇到了错误。此错误的地址为 0x661ffc37,在线程 0xe0c 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。 该如何解决?
支持(0) 反对(0) 苍岭飞龙 | 园豆:0 (初学一级) | 2010-06-22 15:26
@苍岭飞龙: 两种可能 1. 对齐方式有问题,导致访问越界,你试试看只读1个字节能不能读出来。如果还是不行,那可能是指针指向不对,你确认一下在C++下调用这个API是不是也有问题。 2. .net 的bug 如果是64bit 操作系统,可能会出现这个bug,见下面链接 http://connect.microsoft.com/VisualStudio/feedback/details/284215/fatalexecutionengineerror-when-using-custom-marshaling-in-64bit
支持(0) 反对(0) eaglet | 园豆:17139 (专家六级) | 2010-06-23 08:03
1

没有遇到过这种情况,不过使用Marshal.PtrToStructure方法时要求具有UnmanagedCode权限

---------以下摘自msdn

此方法使用 SecurityAction.LinkDemand 防止不可信代码对它进行调用;只有直接调用方才需要具有 SecurityPermissionAttribute.UnmanagedCode 权限。如果您的代码可从部分受信任的代码调用,则未经验证不要将用户输入传递给 Marshal 类方法。有关使用 LinkDemand 成员的重要限制,请参见 Demand 和 LinkDemand。

---------

希望对你有帮助

bj2010 | 园豆:205 (菜鸟二级) | 2010-06-22 16:40
-2

 第二个:

        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct  RESULT
        {
            public uint RequestID;
            public ushort hService;
            public int hResult;
            public int u;
            public STATUS lpBuffer;    //指向第一个结构体的指针;
        }

肖敏 | 园豆:245 (菜鸟二级) | 2010-06-22 23:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册