二級(jí)考試C++實(shí)例:C++動(dòng)態(tài)鏈接實(shí)驗(yàn)

字號(hào):

// ifaststring.h//
    class _declspec(dllexport)IFastString
    {
    public:
    virtual void Delete(void) = 0;
    virtual int Length(void) = 0;
    virtual int Find(const char *psz) = 0;
    };
    extern "C"
    IFastString *CreateFastString(const char *psz);
    // ifaststring.h //
    #include"ifaststring.h"
    class FastString:public IFastString
    {
    private:
    const int m_cch; //number of character
    char *m_psz;
    public:
    FastString(const char *psz);
    ~FastString(void);
    int Length(void);
    int Find(const char *psz);
    void Delete(void);
    };
    // faststring.cpp//
    #include
    #include"faststring.h"
    IFastString *CreateFastString(const char *psz)
    {
    return new FastString(psz);
    }
    FastString::FastString(const char* psz):m_cch(strlen(psz)),
    m_psz(new char[strlen(psz)+1])
    {
    strcpy(m_psz, psz);
    }
    FastString::~FastString(void)
    {
    delete[] m_psz;
    }
    void FastString::Delete(void)
    {
    delete this;
    }
     int FastString::Length(void)
    {
    return m_cch;
    }
     int FastString::Find(const char *psz) //the function is not complete
    {
    return 1;
    }
    // mainTest.cpp//
    #include"ifaststring.h"
    #include
    using namespace std;
    int f(void)
    {
    int n = -1;
    IFastString *pfs = CreateFastString("Hi Bob");
    if( pfs->Find("g") )
    {
    cout<<" test success! "<    }
    return 2;
    }
    int main( )
    {
    int m;
    m = f();
    cout<     return 0;
    }
    在Faststring.DLL中,除了一個(gè)入口函數(shù)之外,其它所有入口函數(shù)都是虛函數(shù)。接口類的虛函數(shù)總是通過(guò)保存在vbtl中的函數(shù)指針被間接調(diào)用,客戶程序不需要在開(kāi)發(fā)的時(shí)候鏈接這些函數(shù)的符號(hào)名??荚?大提示這意味著接口方法可以不受“不同編譯器之間符號(hào)名改編方式的不同的影響”。需要通過(guò)名字顯式鏈接的入口函數(shù)是CreateFastString,這個(gè)全局函數(shù)使得客戶可以進(jìn)入到FastString的世界中。這個(gè)函數(shù)使用extern “c”被引出,從而避免了符號(hào)名改編方式的沖突。這也隱含著所有的C++編譯器都期盼引入庫(kù)和DLL引出同樣的符號(hào)。 使用這項(xiàng)技術(shù)的一個(gè)直接結(jié)果是, 我們可以安全的在一個(gè)C++環(huán)境中暴露DLL中的類,并且在另一個(gè)C++開(kāi)發(fā)環(huán)境中訪問(wèn)這個(gè)類。對(duì)于建立一個(gè)與編譯器廠商無(wú)關(guān)的可重用組件來(lái)說(shuō) ,這種能力是非常重要的!