2015-07-13 93 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()是方便,但它既不比更安全,也不快另外,只需簡單地複製結構成員。