在Matlab中使用带有DLL的Win32句柄

时间:2012-06-27 17:08:01

标签: matlab dll handle

我想在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');

现在可以在Matlab中使用API​​函数。在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,....)时使用?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用此代码创建MATLAB指针:

pbar = libpointer('voidPtr',[ uint8('some string') 0])
pparameter1 = libpointer('uint32',0)

并调用您的DLL函数使用以下命令:

calllib('foo','Device_Init',pbar,pparameter1,...)