成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解 QT 源碼之 QLibrary 跨平臺調用動態庫實現

移動開發
本文介紹將會介紹 QT 源碼之 QLibrary 跨平臺調用動態庫實現,在內容中,將會討論Qt是如何封裝這兩種不同的調用動態庫的方法。先看內容。

詳解 QT 源碼之 QLibrary 跨平臺調用動態庫實現是本文要講解的內容,在不同同臺上動態庫的使用,先來看內容。

1、win下動態庫調用有關的函數包括:

(1)LoadLibrary,裝載動態庫

(2)GetProcAddress,獲取要引入的函數,將符號名或標識號轉換為DLL內部地址。

(3)FreeLibrary,釋放動態鏈接庫。

2、unix上與動態庫調用有關的函數包括:

(1)_打開動態鏈接庫:dlopen,函數原型void *dlopen (const char *filename, int flag);

dlopen用于打開指定名字(filename)的動態鏈接庫,并返回操作句柄。

(2)取函數執行地址:dlsym,函數原型為: void *dlsym(void *handle, char *symbol);

dlsym根據動態鏈接庫操作句柄(handle)與符號(symbol),返回符號對應的函數的執行代碼地址。

(3)關閉動態鏈接庫:dlclose,函數原型為: int dlclose (void *handle);

dlclose用于關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。

(4)動態庫錯誤函數:dlerror,函數原型為: const char *dlerror(void); 當動態鏈接庫操作函數執行失敗時,dlerror可以返回出錯信息,返回值為NULL時表示操作函數執行成功。

我們來分析下Qt的源代碼,看看Qt是如何封裝這兩種不同的調用動態庫的方法。

下面是我用vc編寫的一個動態庫中的函數add:

  1. extern "C" __declspec(dllexport) int __stdcall add(int a,int b)  
  2. {  
  3.     return a+b;  

下面我就用QLibrary來調用一下:

  1. QLibrary lib("QtDllTest.dll");  
  2. if (lib.load())  
  3. {  
  4.     typedef int(*AddFunction)(int a,int b);  
  5.     AddFunction Add=(AddFunction)lib.resolve("add");  
  6.     if (!Add)  
  7.     {  
  8.         cout<<"failed"<<endl;  
  9.     }  
  10.     else  
  11.     {  
  12.        int m;  
  13.        m=Add(1,1); //來個計算1+1  
  14.        cout<<"result:"<<m<<endl;  
  15.     }  
  16.     lib.unload();  
  17. }  
  18. else  
  19. {  
  20.     cout<<"failed"<<endl;  

首先將目錄切換到QTDIR\src\corelib\plugin,這里面就是QLibrary實現的源代碼,打開qlibrary_p.h(熟悉了Qt的常用手法,就知道,這就是QLibrary內部實現的代碼),可以看到

  1. bool load_sys();  
  2. bool unload_sys();  
  3. void *resolve_sys(const char *); 

三個函數。在qlibrary.cpp中可以找到調用這三個函數的地方

  1. bool QLibrary::load ()調用了load_sys;  
  2. bool QLibrary::unload ()調用了unload_sys;  
  3. void * QLibrary::resolve ( const char * symbol )調用了resolve_sys 

但是并沒有找到這三個函數的實現,這是這么回事呢?

打開QTDIR\src\corelib\plugin\plugin.pri文件,

  1. win32 {  
  2.  SOURCES += plugin/qlibrary_win.cpp  
  3. }  
  4. unix {  
  5.  SOURCES += plugin/qlibrary_unix.cpp  

原來如此啊。

我們仔細看下qlibrary_win.cpp文件,load_sys函數調用了LoadLibrary,unload_sys調用了FreeLibrary,resolve_sys調用了GetProcAddress。

而在qlibrary_unix.cpp文件中,各種linux平臺又分好多種。但是基本上load_sys調用了dlopen,unload_sys調用了dlclose,resolve_sys調用了dlsym。

在HPUX中dlopen對應shl_load,dlclose對應shl_unload,dlsym對應shl_findsym。

原來QLibrary就是這樣實現不同平臺動態庫的調用。

小結:詳解 QT 源碼之 QLibrary 跨平臺調用動態庫實現的內容介紹完了,希望本篇文章對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-06-24 09:01:20

Qt QLibrary dll

2012-07-06 15:10:39

跨平臺工具QtNokia

2011-06-23 14:05:32

Qt 事件機制

2011-06-21 14:01:07

QT 界面庫 Embedded

2011-07-08 20:54:12

iPhone WCF

2011-08-29 09:33:24

WindowsQt庫靜態

2011-06-23 10:16:55

VS2010 QT 4.7.2 QT

2011-06-23 11:16:39

Qt Excel

2011-06-23 13:38:27

QT 元對象 信號

2012-07-06 15:00:03

跨平臺工具MoSync

2012-07-06 15:08:14

跨平臺工具Netbiscuits

2011-06-28 16:18:24

Qt QObject

2023-02-10 14:54:20

編譯工具cmake

2011-06-23 13:25:42

QT 源碼 窗口

2011-06-20 13:54:41

Qt 動態 切換

2011-06-27 16:59:19

Qt 動態 插件

2011-04-01 10:40:53

WCFiPhone調用

2012-06-14 09:48:06

跨平臺工具SeregonDragonRad

2012-07-06 14:02:25

跨平臺工具RunRevLiveCode

2012-07-06 13:50:44

跨平臺工具Adobe Phone
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 爱爱小视频 | 国产精品视频免费观看 | 99久久婷婷国产综合精品首页 | 日韩在线一区二区三区 | 黑人巨大精品欧美一区二区免费 | 国产一级视频在线观看 | 五月天激情综合网 | 国产成人精品一区二区 | 亚洲综合中文字幕在线观看 | 精品国产乱码久久久久久蜜柚 | av网址在线| 亚洲欧美一区二区三区在线 | 国产三级国产精品 | 欧美一级视频在线观看 | 精品免费观看 | 粉色午夜视频 | 婷婷色网 | 青青草原综合久久大伊人精品 | 91视频一88av| 999久久久精品 | chinese中国真实乱对白 | av在线免费观看网站 | 亚洲精品一区二三区不卡 | 国产精品一二三区 | 精品一区二区久久久久久久网站 | 免费高清av | 国产极品粉嫩美女呻吟在线看人 | 亚洲欧美在线观看 | 成av在线| 欧美老少妇一级特黄一片 | 国产精品日产欧美久久久久 | 在线亚洲精品 | 国产精品免费一区二区三区四区 | 天堂成人国产精品一区 | 欧美日韩久久精品 | 国产精品久久久久久238 | 国产美女在线精品免费 | 日本中文在线视频 | 成人黄色在线观看 | 一区二区国产在线观看 | 2019天天干天天操 |