【问题标题】:Using Win32 handles with DLLs in Matlab在 Matlab 中使用带有 DLL 的 Win32 句柄
【发布时间】:2012-06-29 04:48:38
【问题描述】:

我有一台设备,我想在 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 dll handle


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 2021-10-04
      • 2011-04-25
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多