loadlibrary problem with DLL file

23 views (last 30 days)
Will
Will on 14 May 2013
Answered: Wardo on 20 Aug 2016
When I try to call loadlibrary in MATLAB on a particular DLL file (using 64bit R2013a in Windows 7), I get a big list of errors like these:
error C2143:
syntax error : missing ')' before '*'
error C2143:
syntax error : missing ')' before '='
The errors refer to all lines in the DLL's header file that have or optional inputs like:
Int32 NCB_API PositionerCheck( PositionerInfo** posInfo );
or
Int32 NCB_API PositionerMoveAbsolute( Int32 deviceHandle, Int32 axisNo, Int32 position, Int32 rotCount = 0 );
I wrote a short C++ mex function that uses LoadLibrary() (the C++ function) to load the DLL and call its functions. My mex function compiles without problems with Microsoft Visual C++ 2012 and can successfully call the DLL functions.
The company that produced the DLL also supplies a 32bit version. With the 32bit version, I can compile and use my mex function , and I can also call loadlibrary in MATLAB and use the DLL that way. The header file for the 32bit version is identical to the 64bit one.
So far, I have only found one solution page ( http://www.mathworks.com/support/solutions/en/data/1-HNFE5H/index.html?solution=1-HNFE5H ) that seems relevant. I tried adding
#define __fastcall
to the header file, but the errors were unchanged.
Is there anything else I can try to get loadlibrary to work? The errors seem pretty generic, so I am not sure what to do to debug the problem. The DLL is supplied by a third party, so I do not have access to its contents to check if it contains an error, but since the mex function works with the DLL and the company's 32bit DLL works okay, it does not seem like the DLL is the problem.
SEBASTIAN: Your private message had no contact information, so I have no way to respond to you directly. The only changes I made to attocube's code was to modify hvpositionerinfov2.h as Friedrich suggested. For MATLAB to communicate with the ANC350, you also need to have the ANC350 driver installed, the .dll (and maybe .lib) file needs to be on the Windows path and on the MATLAB path. Then you can use loadlibrary('hvpositionerv2.dll','hvpositionerv2.h') to load the library and calllib('hvpositionerv2',...) to access the ANC350 API. If you need more help, send another private message with some form of contact information. I hope this helps. I can send you my notes and MATLAB functions if you want them.

Accepted Answer

Friedrich
Friedrich on 16 May 2013
Hi,
loadlibrary is for native C only. So if your header file contains C++ statements it won't work. Make sure your header file is C compatible.
In the case it doesn't help, upload your header files and DLL's and post the link. Also state how you call loadlibrary in MATLAB.
  4 Comments
Friedrich
Friedrich on 21 May 2013
Edited: Friedrich on 21 May 2013
Small update. Whoever did this header file had no knowledge about native C. The struct definition for PositionerInfo is not really correct in the way PositionerInfo is used later on. This will result in an invalid identifier PositionerInfo. Declare the struct like this:
typedef struct PositionerInfo{
int id;
bool locked;
}PositionerInfo;
Will
Will on 21 May 2013
Thanks, Friedrich! With those changes I was able to communicate with the device.

Sign in to comment.

More Answers (2)

Philip Borghesani
Philip Borghesani on 15 May 2013
Edited: Philip Borghesani on 15 May 2013
Most likely there is #include statement missing from the library header file. "windows.h" is a common offender but it could be any header. You will need to modify the header you are using for loadlibary or create a new header that includes all needed headers and use a loadlibrary containing an addheader option:
loadlibrary(..., 'addheader','originalheader')
To find the headers you need look to any headers included before the libraries on in you mex file. To reproduce the compile error move the library header to first in the mex file.
  3 Comments
Philip Borghesani
Philip Borghesani on 15 May 2013
cstdio and cstdlib are c++ headers and not compatible with loadlibrary. To accuratly test for loadlibrary purposes a c mex file is needed. Try just including windows.h
windows.h will produce quite a few warnings from loadlibrary but these can usually be safely ignored.
Will
Will on 15 May 2013
If I add just
#include <windows.h>
to the beginning of my dll's header file, I get the same errors as without the include. I see lots of warnings as well, presumably the ones that you say can be safely ignored.
If I put that include statement in a separate file and use 'addheader' to add it as a second header file, I get the same errors.
If I put this second header file with just the windows.h line first and then put my original header as the 'addheader' file, I get "Warning: No functions found in library."

Sign in to comment.


Wardo
Wardo on 20 Aug 2016
Hi Guys,
What do you suggest is the best way to control the Attocube ANC300 controller via MATLAB?
I have been searching online sometime now for some support on running the Attocube hardware from MATLAB and have found basically nothing.
So far I think my best solution is to build a LabView VI algorithm into a mex/dll file for MATLAB. You seem to have taken a different approach. Friedrich, above seems to have taken a different approach.
Sincerely, Ward

Categories

Find more on C Shared Library Integration in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!