2013-07-15 90 views
2

我有一個非常簡單的dll庫頭文件,但它是用C++編寫的。任何人都可以幫助我編輯它,以便與Matlab(本地C)中的「LoadLibrary」命令兼容?我意識到這不是一個普遍的問題,但更可能缺乏我的知識。但如果解決方案很簡單,我將不勝感激任何建議。Matlab:用於dll的C++頭文件

// 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); 

鏈接下載庫(64位): https://docs.google.com/file/d/0BzzppV2CG8ZldzFRVzJUa252MHc/edit?usp=sharing

Matlab的R2013a 64

+0

您是否發現[此主題](https://www.mathworks.com/matlabcentral/newsreader/view_thread/154975)呢? –

+0

您也可以創建一個C++ MEX函數,該函數鏈接上述庫。然後它很容易使用'GetTPIErrorDescription_string'版本,它將'std :: string'作爲'mxArray'返回給MATLAB。 – Amro

回答

3

的唯一功能,您可以調用爲GetTPIErrorDescription_VB。所有其他人都使用你無法訪問的C++類。因此,我建議您執行以下操作:

  1. 從頭文件中刪除所有其他函數。
  2. 刪除#includeusing行。
  3. 刪除#ifdef並用__stdcall替換TRACKERERRORSDLL_VB
  4. 包括windows.h或爲Win32類型添加一些#define語句。
  5. 根據MATLAB是否知道如何處理它,可能處理bool類型。如果MATLAB不能識別它,則用int替換bool

此時調用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您需要進行一些猜測才能調用該函數。知道參數類型還不夠,還需要知道語義。 mex文件將是另一個不錯的選擇。除非可以保證動態鏈接到與DLL相同的CRT,否則您仍然需要使用'GetTPIErrorDescription_VB'。而且該DLL甚至連接到CRT? –

+0

「loadlibrary」現在報告沒有錯誤。但正如你所說的,我用「calllib」調用「GetTPIErrorDescription_VB」有困難。它說沒有這樣的方法。我不知道我該如何猜測。還有關聯的.lib文件。以某種方式可以有用嗎? – flogs