【问题标题】:Marshalling structures containing reference types/arrays包含引用类型/数组的编组结构
【发布时间】:2011-03-14 13:21:05
【问题描述】:

我有问题。这是结构的 C 定义:

typedef struct _UNIMDM_CHG_DEVCFG {
  DWORD dwCommand; 
  LPCWSTR lpszDeviceClass; 
  LPVARSTRING lpDeviceConfig; 
  DWORD dwOption; 
  DWORD dwValue; 
} UNIMDM_CHG_DEVCFG; 

我在 Windows CE 上使用 .NET Compact Framework 3.5。我尝试了很多方法来编组这个结构,例如:

[StructLayout(LayoutKind.Sequential)]
internal struct UnimodemChangeDeviceConfiguration
{
    public int dwCommand;

    public byte[] lpszDeviceClass; 

    public byte[] lpDeviceConfig; 

    public int dwOption; 

    public int dwValue;
}

问题是在此结构的实例上调用 Marshal.SizeOf 时,它会抛出 NotSupportedException。为什么?我尝试对 lpszDeviceClass 使用字符串,但又遇到了问题。指针类型似乎无法编组。

【问题讨论】:

    标签: winapi struct pinvoke windows-ce marshalling


    【解决方案1】:

    CF Marshaler 无法处理此问题。您的结构包含指向数据的指针,当您尝试向下发送 byte[] 时,数据本身无法固定。

    我认为第一个 (LPCWSTR) 可以作为字符串或 StringBuilder 发送(取决于数据是输入还是输出)。

    LPVARSTRING 更复杂。你看过OpenNETCF TAPI library吗?在 structs.cs 中有一个 VarString 的实现,您可能只是在该结构中实习。

    【讨论】:

    • 我看了看,但是那个类没有写正确。我自己写了一个,它有效。问题是在其他实现中 LPVARSTRING 被直接转发给函数(而不是作为结构的一部分)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多