我有一台设备,我想从WinXP32上的Matlab中控制。其 API 打包在具有关联 C 标头的 DLL 中。
设备的 API 函数依赖于硬件描述符,该描述符由其 Win32 句柄访问,只能由 API 函数直接操作。从制造商提供的"foo.h"标题:
typedef HANDLE BAR
#ifdef _DLL_EXPORT
#define _DLL_API __declspec(dllexport)
#else
#define _DLL_API __declspec(dllimport)
#endif
然后,API 函数使用此句柄,其 C 签名的格式为:
FOO_RETURN Device_Init(BAR *pbar, DWORD parameter1, ....)
移动到 Matlab,我加载库:
loadlibrary('foo','foo.h');
API 函数现在在 Matlab 中可用。在libfunctionsview中,它们的签名如下所示:
Name Arguments
Device_Init (voidPtr, uint32, ....)
而 loadLibrary 创建的 "foo.m" 函数将它们描述为:
fcns.name{fcnNum}='Device_Init'; fcns.calltype{fcnNum}='stdcall'; fcns.LHS{fcnNum}="uint32'; fcns.RHS{fcnNum}={'errorPtr, 'uint32', ...)
我的问题是这个句柄"BAR"。以下均不接受:
pbar = libpointer('BAR'); % Type was not found
pbar = libstruct('BAR'); % Undefined function or variable 'lib.BAR'
pbar = libpointer; % Segfaults when passed to DLL
有没有办法在 Matlab 中创建和管理这个句柄"BAR",以便它可以在 Matlab 调用 calllib('foo','command',pbar,....) ?
您可以尝试以下代码来创建 MATLAB 指针:
pbar = libpointer('voidPtr',[ uint8('some string') 0])
pparameter1 = libpointer('uint32',0)
若要调用 DLL 函数,请使用以下命令:
calllib('foo','Device_Init',pbar,pparameter1,...)