2011-01-19 72 views
0

我必須完成一個項目,併爲項目提供了實現了所需功能的dll和頭文件。我被告知只是將頭文件添加到項目中,但這樣我得到unresolve外部錯誤,如果我嘗試使用頭中引用的函數。那麼需要做些什麼來使一切工作? Visual Studio 2010中 這裏有我有文件:http://www.ipix.lt/images/33871682.png 這是頭文件:將dll添加到項目中並使其功能起作用

#ifndef __BIM482_RADAR__ 
#define __BIM482_RADAR__ 

int BIM482OpenRadar(); 
int BIM482AddPlane(double x, double y); 
int BIM482SetPlaneColor(int planeidx, int coloridx); 
int BIM482SetPlanePos(int planeidx, double x, double y); 
void BIM482UpdateRadar(); 

#endif // __BIM482_RADAR__ 

我需要啓動GUI與OpenRadar以及與這些功能的傳遞信息。如何開始這件事?

+0

增加了VS2010標籤的相關性。 – Maxpm 2011-01-19 03:14:01

回答

3

您沒有鏈接的.lib文件。

也許這可以幫助你

http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/

或本:

http://support.microsoft.com/default.aspx?scid=kb;en-us;131313

或本:

http://www.asawicki.info/news_1420_generating_lib_file_for_dll_library.html

,當你有屬在lib文件中,你必須在頭文件的yuor函數上使用__declspec(dllimport)

上述所有方法的替代方法是在源代碼中使用LoadLibrary(...),並在dll中爲這些函數編寫包裝函數,並通過GetProcAddress(...)調用這些dll函數。

struct 
{ 
    HMODULE hDll; 

    int (*BIM482OpenRadar) (); 
    int (*BIM482AddPlane)  (double x, double y); 
    int (*BIM482SetPlaneColor) (int planeidx, int coloridx); 
    int (*BIM482SetPlanePos) (int planeidx, double x, double y); 
    void (*BIM482UpdateRadar) (); 
} dll_funcs = {0}; 

bool ExitRadar(LPCTSTR szDllPath) 
{ 
    if (dll_funcs.hDll) 
     FreeLibrary(dll_funcs.hDll); 

    return true; 
} 

bool InitRadar(LPCTSTR szDllPath) 
{ 
    if (dll_funcs.hDll) 
     return true; 
    dll_funcs.hDll = LoadLibrary(szDllPath); 
    if (!dll_funcs.hDll) 
     return false; 

    dll_funcs.BIM482OpenRadar  = (int(*)())GetProcAddress(dll_funcs.hDll ,("BIM482OpenRadar")); 
    dll_funcs.BIM482AddPlane  = (int(*)(double,double))GetProcAddress(dll_funcs.hDll ,("BIM482AddPlane")); 
    dll_funcs.BIM482SetPlaneColor = (int(*)(int,int))GetProcAddress(dll_funcs.hDll ,("BIM482SetPlaneColor")); 
    dll_funcs.BIM482SetPlanePos = (int(*)(int,double,double))GetProcAddress(dll_funcs.hDll ,("BIM482SetPlanePos")); 
    dll_funcs.BIM482UpdateRadar = (void(*)())GetProcAddress(dll_funcs.hDll ,("BIM482UpdateRadar")); 
    return true; 
} 

int BIM482OpenRadar () 
{ return (*dll_funcs.BIM482OpenRadar)(); }; 

int BIM482AddPlane  (double x, double y) 
{ return (*dll_funcs.BIM482AddPlane)(x ,y); } 

int BIM482SetPlaneColor (int planeidx, int coloridx) 
{ return (*dll_funcs.BIM482SetPlaneColor)(planeidx ,coloridx); } 

int BIM482SetPlanePos (int planeidx, double x, double y) 
{ return (*dll_funcs.BIM482SetPlanePos)(planeidx ,x ,y); } 

void BIM482UpdateRadar () 
{ return (*dll_funcs.BIM482UpdateRadar)(); } 
0

有一個窗口調用可以將DLL加載到圖像中。您可以將其添加到Visual Studio中的編譯設置,或者動態加載它。

最簡單的事情可能是在編譯時做到這一點;谷歌「Visual Studio llinking選項」。

0

您需要從dll導出函數,同時從exe文件導入函數。像:

#if defined(XYZLIBRARY_EXPORT) // inside DLL 
#define XYZAPI __declspec(dllexport) 
#else // outside DLL 
#define XYZAPI __declspec(dllimport) 
#endif // XYZLIBRARY_EXPORT 

int XYZAPI BIM482OpenRadar(); 
int XYZAPI BIM482AddPlane(double x, double y); 
int XYZAPI BIM482SetPlaneColor(int planeidx, int coloridx); 
int XYZAPI BIM482SetPlanePos(int planeidx, double x, double y); 
void XYZAPI BIM482UpdateRadar(); 

在DLL,我建議增加一個宏,在預處理器加XYZLIBRARY_EXPORT

它會導出所有的功能。

在EXE中,導入該功能,但不添加預處理器,因爲它默認會導入該功能。

0

除了包含頭文件之外,還需要將程序與相應的庫鏈接起來。從你的截圖中,你似乎有.a文件,這確實是庫,但不幸的是它們是用於GCC工具鏈的,並且不適用於Visual Studio。如果您必須使用Visual Studio,或者切換到GCC端口(例如MinGW),則您需要獲得.lib文件。

+0

我很害怕這種感覺..我想我必須移動,因爲沒有.lib文件,只是.a。 – gemexas 2011-01-19 02:53:14

0

您可以使用Windows API LoadLibrary加載運行時的DLL,然後GetProcAddress檢索功能的地址。在函數地址被檢索後,您需要聲明方法簽名,以便編譯器知道如何調用給定的函數。

下面是如何「鏈接」到DLL函數的樣本代碼:

HINSTANCE m_hExtDll = LoadLibrary("SDL.dll") 
if (m_hExtDll) 
{ 
    FARPROC m_pfnOpenRadar = GetProcAddress(m_hExtDll, "BIM482OpenRadar") 
    if (m_pfnOpenRadar) 
    { 
     typedef int (*OPENRADARFUNC)(); 
     OPENRADARFUNC fnOpenRadar = (OPENRADARFUNC)m_pfnOpenRadar; 

     int iRetCode = fnOpenRadar(); 
    } 
} 

請注意,導出的函數受到名字改編,您可以使用第三方工具,例如驗證函數名Dependency Walker