天天看點

C++ DLL 建立執行個體 導出類和函數

今天工作閑下來, 就試看dll程式設計, 好久沒玩dll了,結果花了一個半小時才寫出這個很簡單的例子.

起初直接把子__declspec(dllexport) 放在類聲明的地方. 發生 warning c4273 dll 連結不一緻錯誤.

想了挺長時間才意識到是生成lib時并頭檔案和原檔案中對函數的名字解析名字不一樣而産生的.  才想到要定義一個宏.

有點感歎知識不用會也會老的. 下邊是代碼

//頭檔案:testclass.h

<b>[cpp]</b> view plaincopyprint?

#ifndef test_class_h__   

#define test_class_h__   

#include &lt;iostream&gt;   

using namespace std;  

#ifdef serverdll_exports //在建立産生dll的工程中先把 serverdll_exports 預定義上   

#define serverdll_api __declspec(dllexport)   

#else   

#define serverdll_api __declspec(dllimport)   

#endif   

class serverdll_api testclass  

{  

public:  

    virtual void virtualfunction(void);  

    void normalfunction(void);    

};  

serverdll_api void func(void);  

#endif  

#ifndef test_class_h__

#define test_class_h__

#include &lt;iostream&gt;

using namespace std;

#ifdef serverdll_exports //在建立産生dll的工程中先把 serverdll_exports 預定義上

#define serverdll_api __declspec(dllexport)

#else

#define serverdll_api __declspec(dllimport)

#endif

class serverdll_api testclass

{

public:

virtual void virtualfunction(void);

void normalfunction(void);

};

serverdll_api void func(void);

//實作檔案.testclass.cpp 

<b>[c-sharp]</b> view plaincopyprint?

#include "testclass.h"   

void testclass::virtualfunction(void)  

    {  

        cout&lt;&lt; "this is virtualfunction()!" &lt;&lt;endl;  

        return;  

    }  

void testclass::normalfunction(void)  

        cout&lt;&lt; "this is normalfunction()!" &lt;&lt;endl;  

void func(void)  

    cout &lt;&lt; "xixi haha" &lt;&lt;endl;  

    return;  

}  

#include "testclass.h"

void testclass::virtualfunction(void)

cout&lt;&lt; "this is virtualfunction()!" &lt;&lt;endl;

return;

}

void testclass::normalfunction(void)

cout&lt;&lt; "this is normalfunction()!" &lt;&lt;endl;

void func(void)

cout &lt;&lt; "xixi haha" &lt;&lt;endl;

//調試代碼

#include &lt;windows.h&gt;   

#include &lt;e://myself//myproject//網絡程式//serverdll//testclass.h&gt;    

#pragma comment(lib, "e://myself//myproject//網絡程式//serverdll//debug//serverdll.lib")   

//testclass類為dll導出的類   

class my : public testclass  

        virtual void virtualfunction()  

        cout&lt;&lt; "my virtualfunction()" &lt;&lt;endl;  

    void normalfunction()  

        cout&lt;&lt; "my normalfunction()" &lt;&lt;endl;  

int main(void)  

    my my;  

    testclass *tc = &amp;my;  

    tc-&gt;normalfunction();  

    tc-&gt;virtualfunction();  

    //調用導出的函數   

    func();  

    cout&lt;&lt;"liu zhiliang"&lt;&lt;endl;  

    system("pause");  

    return 0;  

#include &lt;windows.h&gt;

#include &lt;e://myself//myproject//網絡程式//serverdll//testclass.h&gt;

#pragma comment(lib, "e://myself//myproject//網絡程式//serverdll//debug//serverdll.lib")

//testclass類為dll導出的類

class my : public testclass

virtual void virtualfunction()

cout&lt;&lt; "my virtualfunction()" &lt;&lt;endl;

void normalfunction()

cout&lt;&lt; "my normalfunction()" &lt;&lt;endl;

int main(void)

my my;

testclass *tc = &amp;my;

tc-&gt;normalfunction();

tc-&gt;virtualfunction();

//調用導出的函數

func();

cout&lt;&lt;"liu zhiliang"&lt;&lt;endl;

system("pause");

return 0;

輸出:

this is normalfunction()!  

my virtualfunction()  

xixi haha  

liu zhiliang  

請按任意鍵繼續. . .  

繼續閱讀