详细描述:
主要是由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)的指针”使用失败,该如何定义和操作结构体才能正确使用该指针呢?
请求各位高手指教啊!我郁闷一个上午了,都没有找到解决方法。
是用 Marshal.PtrToStructure()转换的吗?错误提示是什么?
没有遇到过这种情况,不过使用Marshal.PtrToStructure方法时要求具有UnmanagedCode权限
---------以下摘自msdn
此方法使用 SecurityAction.LinkDemand 防止不可信代码对它进行调用;只有直接调用方才需要具有 SecurityPermissionAttribute.UnmanagedCode 权限。如果您的代码可从部分受信任的代码调用,则未经验证不要将用户输入传递给 Marshal 类方法。有关使用 LinkDemand 成员的重要限制,请参见 Demand 和 LinkDemand。
---------
希望对你有帮助
第二个:
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct RESULT
{
public uint RequestID;
public ushort hService;
public int hResult;
public int u;
public STATUS lpBuffer; //指向第一个结构体的指针;
}