我想将相当复杂的类型从托管世界转移到本地世界,反之亦然。
目前正在通过创建多维安全阵列来实现这一目标,这种安全阵列具有为您完成编组的优势,但意味着我们最终会得到相当复杂的锯齿状阵列,以便让我们清醒过来。
我试图将一些结构放入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))