亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優(yōu)質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業(yè)務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發(fā)消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

從Linux and Windows中引入類

添加時間:2010-12-6  添加: admin 
從Linux and Windows 的動態(tài)庫中引入類的方法

  一般從Windows的動態(tài)庫引入類的方法比較簡單,只需要在DLL的類的申明出加入EXPORT就可以,但是這種方法只限于編譯的時候引入 DLL,就是通過Lib的方式引入DLL,但是很多情況下需要在程序的運行期來引入Dll,就像在程序運行的時候使用LoadLibrary獲得動態(tài)庫,然后通過GetProcAddr來取得函數在庫中的地址。怎樣能夠在運行的時候從動態(tài)庫中引入類的申明呢?

  首先在Windows下看一看如何做:

  我們知道,在DLL中的類實際上只是一個類型的申明,他并沒有實際的地址,所以希望通過地址來直接取出一個類的方法是無效的。雖然直接取不行,但是可以使用間接的方法,我們可以在DLL中創(chuàng)建一個全局函數或者靜態(tài)函數,用這個函數來創(chuàng)建一個類的對象,這樣我們就可以使用該類了。

  看這一段申明DLL的代碼:

  這個演示的類有兩個成員函數,一個是init()函數,用來初始化成員變量,另一個是print()函數,用來輸出成員變量。為了使這個類能夠被外部程序使用,我們?yōu)樗砑恿藘蓚成員函數,請見下面:

  1.Create()函數,他用來創(chuàng)建一個MyClass的對象,并且返回一個指向該類的指針。

  2.Destroy()函數,他用來銷毀前面創(chuàng)建的MyClass的對象指針并釋放資源。

  通常一個類的所有成員函數都要在外部一一申明這樣才可以使用,這里我們使用了一個技巧,就是把所有的Public屬性的成員函數全部申明成virtual函數,利用虛函數自動與對象動態(tài)幫定的特性,這樣在使用時直接引用對象的成員方法就可以了。

  #define EXPORT __declspec(dllexport)

  class MyClass{

  int x;

  int y;

  public:

  //把Create和Destroy方法申明為靜態(tài)的和可供符號輸出的

  EXPORT static MyClass * Create()

  {

  return new MyClass();

  }

  EXPORT static void Destroy(MyClass * mc)

  {

  delete mc;

  }

  virtual void init();

  virtual void print();

  };

  在主程序使用動態(tài)庫中的類的方法:

  首先定義函數指針類型

  typedef MyClass* (*CreateMyClass)();

  在主函數中:

  //先LoadLibrary讀取DLL庫

  HINSTANCE hInstance = LoadLibrary("MyDll.dll");

  //用普通的GetProcAddress方法取得Create函數的地址;

  CreateMyClass createMC =

  (CreateMyClass)(GetProcAddress(hInstance,

  MAKEINTRESOURCE(1)));

  //然后用Create函數創(chuàng)建對象

  MyClass *d = createMC();

  //下面就可以使用該對象了。

  d->init();

  d->print();

  下面介紹Linux下的動態(tài)庫中的類的輸出方法:

  Linux的動態(tài)庫一般稱為共享庫(shared library),其特征是以“.so”為文件的擴展名。

  同 WIindows一樣Linux下的動態(tài)庫的類的輸出也是要依靠動態(tài)庫中的一個全局函數或者靜態(tài)函數,與Windows中的輸出方法不一樣的地方是 Linux沒有__declspec(dllexport)關鍵字。但他必須把要輸出的函數申明為extern “C”類型的,這樣在GetProcAddr時候才能找到該地址

  實例的Shared Library代碼如下:

  #include

  class MyClass{

  int x;

  int y;

  public:

  virtual void init();

  virtual void print();

  };

  extern "C" {MyClass * Create()

  {return new MyClass();

  }

  }

  //1-2)linux shared library cpp file

  #include "MyDll.h"

  void MyClass::init()

  {

  x=3;

  y=4;

  }

  void MyClass::print()

  {

  printf("%d%d\n",x,y);

  }

  主程序文件如下:

  #define SHARED

  #define SOFILE "./mydll.so"

  #include

  #include "dlfcn.h"

  #include "Mytest.h"

  using namespace std;

  MyClass* (*CreateClass)();

  int main()

  {

  void *dp;

  char *error;

  dp = dlopen(SOFILE,RTLD_LAZY);

  if(dp == NULL)

  {

  cout<<"can't open file"<< p>

  }

  CreateClass =(MyClass*(*)())dlsym(dp,"Create");

  error = dlerror();

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業(yè)務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站