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関数によって使用されます。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

このハンドル「BAR」をMatlabで作成および管理して、calllib('foo'、'command'、pbar、....)へのMatlab呼び出しで使用できるようにする方法はありますか?

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 に答える