7

我正在使用 MEX 接口在 MATLAB 中运行 C++ 代码。我想在 MATLAB 中添加几个函数来处理System对象:

sysInit()
sysRefresh()
sysSetAttribute(name, value)
String = sysGetAttribute(value)
sysExit()

由于每个 MEX dll 都可以包含一个函数,因此我需要找到一种方法来存储指向全局System对象的指针,该对象将一直存在,直到通过调用sysExit.

如何在 MATLAB 中正确执行此操作?有没有办法在对 MEX 函数的调用中存储全局指针?

4

2 回答 2

8

一种常见的方法是拥有几个提供公共接口的 m 文件函数,例如 sysInit.m、sysRefresh.m 等。

这些 m 文件中的每一个都使用某种句柄、一个标识要调用的函数的字符串(或数字)以及任何额外的参数来调用 mex 函数。例如,sysRefresh.m 可能如下所示:

function sysRefresh(handle)
return sysMex(handle, 'refresh')

在您的 sysMex mex 函数中,您可以将句柄设置为原始堆指针(简单,但不是很安全),或者您可以在 C/C++ 中维护从句柄 ID 到实际对象指针的映射。这个解决方案需要一些额外的工作,但它更安全。这样,某人就不会意外地将任意数字作为句柄传递,该句柄充当悬空指针。此外,您可以做一些更有趣的事情,例如在卸载 mex 函数时使用 onCleanup 函数释放所有内存和资源(例如,当您重新编译 mex 函数时不必重新启动 matlab)。

如果您愿意,您可以走得更远,并将句柄隐藏在 Matlab 类后面。如果您有兴趣,请阅读文档中 Matlab 的 OO 功能。如果您使用的是最新版本,则可以利用它们更干净的句柄对象。

于 2009-07-27T11:46:38.327 回答
3

Alternatively, you may get away with not using MEX at all. In matlab (on Windows) you can load any generic dll with loadlibrary and call any of its functions with callib. This is probably not portable across operating systems, though.

于 2009-07-27T17:14:26.797 回答