2013-02-16 56 views
1
int atClass1::read_file 
(String^ file_path, /* Path tofile */ 
HdfCallVars % ret_vals) 

這是我的功能。在它裏面我有很多原生的C++代碼。我碰到一個嚴重的問題,雖然被管理的結構被髮送到非託管功能

/* Iterate through the links, filling in needed data as discovered. */ 
    io_err = H5Literate (group_id, H5_INDEX_NAME, H5_ITER_NATIVE, 

       &i, get_sonar_data, (void*)& ret_vals); 

不會編譯!說ret_vals是管理,我不能做pointerey ampersandey的東西。我有麻煩了嗎?或者有什麼辦法擺脫我的困境? H5函數是對HDF5庫的調用。 謝謝, saroj

回答

0

在.Net中不能保證一個對象將保留在當前的內存位置,因爲垃圾收集器會在需要時「堆棧」堆空間。

爲了得到一個原生指針管理對象,你應該「銷」的對象:

pin_ptr<HdfCallVars> pinned = &ret_vals; 
io_err = H5Literate (group_id, H5_INDEX_NAME, H5_ITER_NATIVE, 
         &i, get_sonar_data, (void*)pinned); 

注意,指針將被取消固定變量pinned超出範圍後,如果H5Literate存儲指針將來使用,應使用系統:運行:: InteropServices ::的GCHandle管腳值,像這樣:

GCHandle ^handle = GCHandle::Alloc(ret_vals); 
io_err = H5Literate (group_id, H5_INDEX_NAME, H5_ITER_NATIVE, 
         &i, get_sonar_data, (void*)handle->AddrOfPinnedObject()); 

當你不需要指針了,你應該釋放它:

handle->Free(); 
+0

非常感謝您的詳細回覆 - 我會馬上試用!非常感謝!saroj – 2013-02-16 05:21:49

+0

GreenBoxal,我需要H5LIterate來填充我的ret_vals。它是否會這樣做,就像你在例2中寫的那樣? (例1不會編譯)。呼叫H5功能後,如何再次訪問ret_vals?謝謝,saroj – 2013-02-17 04:58:41

+0

爲什麼不編譯?嘗試使用cli :: pin_ptr,這兩個示例都應寫入ret_vals,並且您可以正常訪問它 – greenboxal 2013-02-17 05:16:26