2015-07-13 79 views
0

我想元帅UMS为s(这也同样对齐类型):非托管结构来管理编组

void F(ManagedStruct ^s) 
{ 
    ummanagedStruct ums; 
    FillTheStruct(&ums); 
    s = ? 
} 

我需要分配使用AllocHGlobal非托管内存,像这样?:

void F(ManagedStruct ^s) 
{ 
    IntPtr ptr = Marshal::AllocHGlobal(Marshal::SizeOf(s); 

    FillTheStruct(static_cast<unmanagedStruct*>(ptr.ToPointer); 
    s = (ManagedStruct^)Marshal::PtrToStruct(ptr, ManagedStruct::typeid); 
} 

回答

1
void F(ManagedStruct ^s) 

如果您打算将值传回给调用者,那就错了。该参数必须通过引用传递,以便调用者的变量可以更新。如果“ManagedStruct”实际上是一个值类型,那么^ hat也是错误的。您只能在参考类型上使用它,您声明的种类为ref structref class。令人遗憾的是,C++/CLI不会为这种用法生成诊断,它假定您故意打算将该值封闭。

修复:

void F(ManagedStruct% s) 

或一般理智的一个值类型:

ManagedStruct F() { 
     unmanagedStruct ums; 
     FillTheStruct(&ums); 
     return (ManagedStruct)Marshal::PtrToStructure(IntPtr(&ums), ManagedStruct::typeid); 
    } 

,同时说明元帅:累得PtrToStructure()是方便,但它既不比更安全,也不快另外,只需简单地复制结构成员。