// 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)的可重用組件來說 ,這種能力是非常重要的!
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<
}
在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)的可重用組件來說 ,這種能力是非常重要的!