欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

用C++面向?qū)ο蟮姆绞絼討B(tài)加載so的方法

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次

這幾天在寫一個server,由于框架相同,僅僅是獲取數(shù)據(jù)源的地方有區(qū)別,所以,研究了一下如何使用面向?qū)ο蟮姆椒▉韯討B(tài)加載so。

主要思想就是:

1.通過一個函數(shù)能夠獲得一個基類的指針,這樣在調(diào)用基類的函數(shù)的時候,就能自動調(diào)用子類的實現(xiàn)了。

2.存儲so對象的指針應(yīng)該是外層類的一個static變量。

詳細還是看代碼吧:

1)首先定義一個公共的頭文件,里面存儲的基類的定義:(需要注意的就是,只要不是純虛函數(shù),那么就一定要有實現(xiàn);還有就是析構(gòu)函數(shù)需要為虛函數(shù))

so和主調(diào)程序都需要包含這個頭文件。

source_base.h

#ifndef _SOURCE_BASE_H_
#define _SOURCE_BASE_H_
#include <iostream>
using namespace std;
class CSourceBase;
/** 
 * @brief  獲取實例
 * 
 * @param  client    new出的指針
 * 
 * @return  0      succ
 *       else    fail
 */
extern “C” int CreatObj(CSourceBase *& client);
class CSourceBase
{
  public:
    CSourceBase(){};
    virtual ~CSourceBase(){};
  public:
    virtual int GetFriends(int iUin,char *data,int &iLen,int maxLen)
    {
      return 0;
    }
};
#endif

2)我們來看so的實現(xiàn)

xy_source.h

#ifndef _XY_SOURCE_H_
#define _XY_SOURCE_H_
#include <iostream>
#include “sourcebase.h”
using namespace std;
class CXY_Source:public CSourceBase
{
  public:
    CXY_Source();
    virtual ~CXY_Source();
    {}
    int GetFriends(int iUin,char *data,int &iLen,int maxLen);
};
#endif

xy_source.cpp

#include “xy_source.h”
int CreatObj(CSourceBase *& client)
{
  client = new CXY_Source();
  return 0;
}
CXY_Source::CXY_Source() { }
CXY_Source::~CXY_Source() { }
int CXY_Source::GetFriends(int iUin,char *data,int &iLen,int maxLen)
{
  return 0;
}

3)調(diào)用者的實現(xiàn)

這里說明一下,因為這里想要對外封裝成透明的,所以,采用了如下的方式。

xy_client.h

#ifndef _XY_CLIENT_H_
#define _XY_CLIENT_H_
#include <iostream>
#include “sourcebase.h”
using namespace std;
typedef int (*FunPtr)(CSourceBase *& client);
class CXY_Client
{
  public:
    static void *SoObj;
  public:
    CXY_Client();
    virtual ~CXY_Client();
    //載入so
    int Init(const char * soname);
    int GetFriends(int iUin,char *data,int &iLen,int maxLen);
  private:
    CSourceBase *m_Client;
};

xy_client.cpp

#include “xy_client.h”
void* CXY_Client::SoObj=NULL;
CXY_Client::CXY_Client()
{
  m_Client = NULL;
}
CXY_Client::~CXY_Client()
{
  if(m_Client)
  {
    delete m_Client;
  }
}
int CXY_Client::Init(const char * soname)
{
  string strSoName;
  if(soname==NULL)
  {
    strSoName = “../lib/xysource.so”;
  }
  else
  {
    strSoName = soname;
  }
  if(strSoName.size()==0)
  {
    strSoName = “../lib/xysource.so”;
  }
  if(CXY_Client::SoObj == NULL)
  {
    SoObj=dlopen((char*)strSoName.c_str(),RTLD_LAZY);
    if(SoObj==NULL)
    {
      return -1;
    }
  }
  if(m_Client==NULL)
  {
    FunPtr func;
    func = (FunPtr)dlsym(SoObj, “CreatObj”);
    int ret = (*func)(m_Client);
    if(ret)
    {
      return -2;
    }
  }
  return 0;
}
int CXY_Client::GetFriends(int iUin,char *data,int &iLen,int maxLen)
{
  return m_Client->GetFriends(iUin,data,iLen,maxLen);
}

OK,到此為止代碼就結(jié)束了,大家可能會發(fā)現(xiàn)我沒有調(diào)用dlclose,這是因為static變量沒有必要來調(diào)用,在進程結(jié)束時會自動釋放句柄,當(dāng)然如果需要有釋放的應(yīng)用場景的話,可以通過增加計數(shù)來實現(xiàn)。

另外由于上面的這個實例是從項目中摳出來的,所以并不能直接編譯,還望大家見諒。

但是在這里可以下載到一個簡單的可編譯實例,可以用來作為實現(xiàn)so動態(tài)加載編程的第一步~~

以上就是小編為大家?guī)淼挠肅++面向?qū)ο蟮姆绞絼討B(tài)加載so的方法全部內(nèi)容了,希望大家多多支持我們~

上一篇:淺談do {...} while (0) 在宏定義中的作用

欄    目:C語言

下一篇:linux C++ 獲取文件絕對路徑的實例代碼

本文標(biāo)題:用C++面向?qū)ο蟮姆绞絼討B(tài)加載so的方法

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1866.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有