2013-02-16 57 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