2013-07-02 43 views
2

我知道如何使用顯式鏈接的,不含有類,但怎麼可以鏈接DLL中的DLL包含類,例如:出口:DLL鏈接使用C++

class math{ 
public: 
int sum(int,int); 
}; 

加載它:

typedef int(*func)(int,int); 
    int main{ 
    HINSTANCE hDLL;    // Handle to DLL 
    hDLL = LoadLibrary("math.dll"); 
     func add=(func)GetProcAddress(hDLL, "sum"); 
    add(4,5); 
return 0; 
    } 

如果我這樣做它停止工作並退出程序,如果我刪除類它的工作原理

+0

你不會沒有很多頭痛。使用'__declspec(dllimport)'和'__declspec(dllexport)'代替 –

+0

那麼我怎樣才能使用我的函數,請解釋一下 –

+0

請記住你的'math :: sum'方法需要'this'來工作。 LoadLibrary + GetProcAddress僅適用於普通函數。 – greatwolf

回答

2

GetProcAddress的最多可以裝入導出的符號形成的DLL,爲您提供了正確的名稱叫吧。

在你的情況下,函數不是首先導出。如果是這樣,它肯定不是所謂的「總和」,而是20-40個字符的一些亂碼。

對於使用C++代碼的DLL,您需要完全刪除GetProcAddress方式,並且只依賴名稱正確的implib。

爲此,將__declspec(dllexport)添加到類中(最好在客戶端使用dllimport),並將DLL項目添加爲項目引用。或者將隨DLL一起創建的.lib添加到客戶端項目中。

+0

那麼如何加載求和函數呢?你能寫一些代碼嗎? –

+4

我當然可以但不會,你可以在msdn中找到大量的例子,或者可以谷歌爲他們 –

2

C++編譯器使用name mangling來唯一區分程序中的標識符。這種損壞會導致名稱與您在程序中使用的簡單標識符顯着不同。由於這種使用GetProcAddress對於訪問駐留在DLL中的C++編寫的代碼通常是不切實際的。相反,我建議使用__declspec(dllexport)__declspec(dllimport)來提供對駐留在DLL中的代碼的無痛訪問。

在您的DLL項目中,您需要添加一個名爲「EXPORT_CLASSES」或DLL唯一的預處理器定義。這將被你的DLL和程序用來確定一個特定的聲明應該由DLL導出還是由程序導入。

dllstuff.h

#ifdef EXPORT_CLASSES 
#define IMPORT_EXPORT __declspec(dllexport) 
#else 
#define IMPORT_EXPORT __declspec(dllimport) 
#endif 

你會再更改類聲明math使用此。當編譯DLL時,IMPORT_EXPORT將等於__declspec(dllexport),並且將指示編譯器和鏈接器該類的定義應該公開可用(即通過DLL的導出表)。

mathclass.h

#include "dllstuff.h" 

class IMPORT_EXPORT math 
{ 
public: 
    int sum(int, int); 
}; 

現在你在你的主應用程序做的是包括mathclass.h您要使用的數學課的任何時間。您現在可以實例化一個math的實例並訪問它的成員函數。

#include "mathclass.h" 
int main() 
{ 
    math m; 
    int result = m.sum(1, 2); 
} 

這當然只是過程的基本描述。網上有很多文章(包括SO)在提供更詳細的信息。

+0

int result = m.sum(1,2); undefined refernce:_imp_zn12sum19mathEV 它爲什麼會給出這個錯誤? –

+0

在您的應用程序項目設置中添加對象到DLL項目。 –

+0

我添加了同樣的問題.. –