0

我有一件我想在 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,....) 中使用?

4

1 回答 1

0

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

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

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

calllib('foo','Device_Init',pbar,pparameter1,...)
于 2012-09-19T22:19:44.463 回答