2013-07-15 4 views
2

У меня очень простой заголовочный файл для библиотеки dll, но он находится на C++. Любой может помочь мне отредактировать его таким образом, чтобы он совместим с командой «LoadLibrary» в Matlab (native C)? Я понимаю, что это не общая проблема, а скорее отсутствие моих знаний. Но если решение будет простым, я буду признателен за любые советы.Matlab: заголовочный файл C++ для dll

// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the TRACKERERRORSDLL_EXPORTS 
// symbol defined on the command line. this symbol should not be defined on any project 
// that uses this DLL. This way any other project whose source files include this file see 
// TRACKERERRORSDLL_API functions as being imported from a DLL, whereas this DLL sees symbols 
// defined with this macro as being exported. 
#ifdef TRACKERERRORSDLL_EXPORTS 
#define TRACKERERRORSDLL_API __declspec(dllexport) 
#define TRACKERERRORSDLL_VB __declspec(dllexport) __stdcall 
#else 
#define TRACKERERRORSDLL_API __declspec(dllimport) 
#define TRACKERERRORSDLL_VB __declspec(dllimport) __stdcall 
#endif 

#include <string> 
using namespace std; 

bool TRACKERERRORSDLL_API GetTPIErrorDescription_wstring(long errorNumber, 
               basic_string<__wchar_t> & shortDescription, 
               basic_string<__wchar_t> & longDescription, 
               basic_string<__wchar_t> & solutionDescription, 
               bool & isAutoRecoverOnGreenState); 

bool TRACKERERRORSDLL_API GetTPIErrorDescription_wstring(long errorNumber, 
               basic_string<unsigned short> & shortDescription, 
               basic_string<unsigned short> & longDescription, 
               basic_string<unsigned short> & solutionDescription, 
               bool & isAutoRecoverOnGreenState); 

bool TRACKERERRORSDLL_API GetTPIErrorDescription_string(long errorNumber, 
               string & shortDescription, 
               string & longDescription, 
               string & solutionDescription, 
               bool & isAutoRecoverOnGreenState); 

bool TRACKERERRORSDLL_API GetTPIErrorDescription_CString(long errorNumber, 
               CString & shortDescription, 
               CString & longDescription, 
               CString & solutionDescription, 
               bool & isAutoRecoverOnGreenState); 

bool TRACKERERRORSDLL_VB GetTPIErrorDescription_VB(int errorNumber, 
               LPSTR* shortDescription, 
               LPSTR* longDescription, 
               LPSTR* solutionDescription, 
               bool* isAutoRecoverOnGreenState); 

Ссылка для загрузки библиотеки (64bit): https://docs.google.com/file/d/0BzzppV2CG8ZldzFRVzJUa252MHc/edit?usp=sharing

Matlab R2013a 64bit

+0

Вы нашли [эту тему] (https://www.mathworks.com/matlabcentral/newsreader/view_thread/154975) еще? –

+0

вы также можете создать C++ MEX-функцию, которая ссылается на указанную выше библиотеку. Затем его легко использовать версию 'GetTPIErrorDescription_string', которая принимает' std :: string' и возвращает их в MATLAB как 'mxArray' – Amro

ответ

3

Единственная функция, которую вы можете назвать это GetTPIErrorDescription_VB. Все остальные используют классы C++, к которым у вас нет доступа. Поэтому я предлагаю вам сделать следующее:

  1. Удалить все другие функции из файла заголовка.
  2. Удалите #include и линии using.
  3. Снимите #ifdef и замените TRACKERERRORSDLL_VB на __stdcall.
  4. Либо включите windows.h, либо добавьте несколько операторов #define для типов Win32.
  5. Возможно, имеет дело с типом bool в зависимости от того, знает ли MATLAB, как с этим бороться. Если MATLAB не узнает его, замените bool на int.

В этот момент вызов loadlibrary должен работать и тогда вам просто нужно написать код, который вызывает calllib.

Результирующий файл заголовка может выглядеть как-то так:

#define LPSTR char* 

__declspec(dllimport) bool __stdcall GetTPIErrorDescription_VB(
    int errorNumber, 
    LPSTR* shortDescription, 
    LPSTR* longDescription, 
    LPSTR* solutionDescription, 
    bool* isAutoRecoverOnGreenState 
); 

Наконец, отметим, что LPSTR* довольно удивительно типа столкнуться. Это предполагает, что DLL собирается выделить строки char* C, а затем вернуть их вам через три параметра описания. Это представляет проблему с распределением памяти. Кто собирается освободить память? Нужно ли его освобождать или статично? Эти проблемы необходимо будет решить, обратившись к документации для DLL.

+0

Превосходно! Я попробую это и дам вам знать. Есть ли возможность использовать файл mex? К сожалению, для клиентов нет дополнительной документации по dll. Считаете ли вы, что это может вызвать серьезные проблемы в форме? – flogs

+0

@flogs Вам нужно сделать некоторые догадки, чтобы вызвать эту функцию. Недостаточно знать типы параметров, вам также нужно знать семантику. Мексовый файл был бы еще одним хорошим выбором. Вам все равно нужно использовать 'GetTPIErrorDescription_VB', если вы не можете гарантировать динамическую привязку к тому же CRT, что и DLL. И DLL даже ссылается на CRT? –

+0

«loadlibrary» теперь не сообщает об ошибках. Но, как вы сказали, мне сложно позвонить «GetTPIErrorDescription_VB» с помощью «calllib». В нем говорится, что такого метода нет. Я не уверен, как я могу догадываться. Существует также связанный файл .lib. Может ли это так или иначе быть полезным? – flogs

Смежные вопросы