二級考試C++實例:C++動態(tài)鏈接實驗

字號:

// 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中,除了一個入口函數(shù)之外,其它所有入口函數(shù)都是虛函數(shù)。接口類的虛函數(shù)總是通過保存在vbtl中的函數(shù)指針被間接調(diào)用,客戶程序不需要在開發(fā)的時候鏈接這些函數(shù)的符號名??荚?大提示這意味著接口方法可以不受“不同編譯器之間符號名改編方式的不同的影響”。需要通過名字顯式鏈接的入口函數(shù)是CreateFastString,這個全局函數(shù)使得客戶可以進(jìn)入到FastString的世界中。這個函數(shù)使用extern “c”被引出,從而避免了符號名改編方式的沖突。這也隱含著所有的C++編譯器都期盼引入庫和DLL引出同樣的符號。 使用這項技術(shù)的一個直接結(jié)果是, 我們可以安全的在一個C++環(huán)境中暴露DLL中的類,并且在另一個C++開發(fā)環(huán)境中訪問這個類。對于建立一個與編譯器廠商無關(guān)的可重用組件來說 ,這種能力是非常重要的!