安全阵列可以采用和编组用户定义的类型吗?

时间:2010-03-04 10:09:15

标签: c# windows visual-c++ pinvoke interop

我想将相当复杂的类型从托管世界转移到本地世界,反之亦然。

目前正在通过创建多维安全阵列来实现这一目标,这种安全阵列具有为您完成编组的优势,但意味着我们最终会得到相当复杂的锯齿状阵列,以便让我们清醒过来。

我试图将一些结构放入SAFEARRAYs,但遇到的问题与this未回答的问题非常相似。 msdn似乎暗示这是可能的,但我收效甚微。如果可以,在以下情况下什么是有效的VT_类型?

编辑:谢谢!所以这必须是VT_RECORD。

struct Change
{
    PSTR key;
    PSTR val;
};

struct NodeChages
{
    int nodeId;
    SAFEARRY* changes; //CComSafeArray<Change>
};


STDAPI func(/*CComSafeArray<NodeChanges>*/ SAFEARRAY * f);

在管理方面,我有。

public struct Change
{
    [MarshalAsAttribute(UnmanagedType.LPStr)]
    public string key;
    [MarshalAsAttribute(UnmanagedType.LPStr)]
    public string value;
}

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct NodeChanges
{
    public int nodeId;
     [MarshalAsAttribute(UnmanagedType.SafeArray, SafeArrayUserDefinedSubType = typeof(CurveChange))]
    public Change[] changes;
}

[DllImportAttribute("My.dll", EntryPoint = "Func", PreserveSig = true, CallingConvention=CallingConvention.StdCall)]
   public static extern void Func(
   [MarshalAsAttribute(UnmanagedType.SafeArray, SafeArrayUserDefinedSubType = typeof(NodeChange))]
   NodeChange[] changes
   );

但是这(如the other post中)给了我:

System.ArgumentException : The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))

0 个答案:

没有答案