what data type do i need to calllib with pointer argument char*

14 Ansichten (letzte 30 Tage)
Yoav Romach
Yoav Romach am 28 Mai 2014
Kommentiert: Yoav Romach am 28 Mai 2014
Hey there! I'm using a shared library and I'm tring to call this function from it (from h file):
long PI_FUNC_DECL PI_EnumerateUSB(char* szBuffer, long iBufferSize, const char* szFilter);
So I'm making the following code:
>> szBuffer = libpointer('char');
>> iBufferSize = libpointer('int32');
>> calllib(libalias,'PI_EnumerateUSB',szBuffer,iBufferSize,'E-861');
Error using calllib
Pointer type must match data type
After some checking, the problem is without doubt the char* (szBuffer). From what I understand from Matlab Help I need it to be a char array, so what am I'm doing wrong?
p.s.
I have the problem in other functions as well that require char*
Thanks!

Antworten (1)

Philip Borghesani
Philip Borghesani am 28 Mai 2014
You are over thinking this let MATLAB do the work no libpointers are needed:
[status, resultString]=calllib(libalias,'PI_EnumerateUSB',blanks(100),100,'E-861')
The code you wrote is doing the equivalent of the c code:
char *szBuffer=NULL; int* iBufferSize=NULL;
PI_EnumerateUSB(szBuffer,*iBufferSize,"E-861");
and if you were using C your program would crash...
  2 Kommentare
Yoav Romach
Yoav Romach am 28 Mai 2014
Hey Philip,
The problem is that the function changes the value of szBuffer, and that is what I need...
I actually solved my initial problem by writing:
szBuffer = libpointer('string',blanks(128));
szBuffer.value
calllib(libalias,'PI_EnumerateUSB',szBuffer,128,'')
szBuffer.value
The problem now is that szBuffer does not change its value :/
I also tried passing stringPtr, same results.
An equivalent Python code did work, and the function return value indicates that it ran without errors, so the function in the dll is working, but for some reason the value of szBuffer doesn't change... Any ideas?
Yoav Romach
Yoav Romach am 28 Mai 2014
ERR!
I Solved it, It's really simple but I couldn't find a single place in which this behavior is documented...
So in matlab, instead of changing szBuffer itself, it simply goes into the return value.
So instead of returning just [long] it now returns [long, string] and the string is the new szBuffer. Which means I really don't need pointers...
Why isn't it clearly written in the documentation... :(

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Startup and Shutdown finden Sie in Help Center und File Exchange

Tags

Produkte

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by