包含引用类型/数组的编组结构

时间:2011-03-14 13:21:06

标签: winapi struct pinvoke windows-ce marshalling

我遇到了问题。这是结构的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,但又遇到了问题。似乎指针类型无法被封送。

1 个答案:

答案 0 :(得分:0)

CF Marshaler无法解决这个问题。您的struct包含一个指向数据的指针,当您尝试向下发送byte []时,数据本身无法固定。

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

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