青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

codeArt

codeArt

QT中的插件

 

QT有著獨特的插件管理方法便于使用,調理清晰.完全可以替代WIN32下的動態(tài)庫,靜態(tài)庫.不過,QT也支持動態(tài)庫和靜態(tài)庫加載 .QLibrary,最終,QLibrary調用WIN32下的LoadLibrary,GetProcAddress函數.


Qt插件的使用方法:

[1]project_main_1工程中定義接口

class interface__1
{
public:
    
void __func1() = 0;
    
void __func2() = 0;
    
void __func3() = 0;
}
;
    
class interface__2
{
public:
    
void __func4() = 0;
    
void __func5() = 0;
    
void __func6() = 0;
}
;

[2]project_plugin_1工程中實現接口

class derive__1:public interface__1,interface__2
{
public:
    
void __func1();
    
void __func2();
    
void __func3();
    
void __func4();
    
void __func5();
    
void __func6();
}
;

[3]project_main_1中使用QPluginLoader,QPluginLoader內部實現也是使用LoadLibrary,GetProcAddress,稍后會有說明

用法1:

QobjectList objList = QpluginLoader::staticInstances();
for(int i = 0; i<objList.size(); i++)
{
    interface__1 
*inter1 = qobject_cast< interface__1 *>(objList[i]);
    interface__2 
*inter1 = qobject_cast< interface__2 *>(objList[i]);    
}

用法2:

QpluginLoader pl(“plugin path”);
Qobject
* plugin = pl.instance();

這里可以看出,充分的使用了對象對象的多態(tài).那么,QpluginLoader是如何實現的呢?

看下面細節(jié).

Qt的類幾乎所有的都有一個QT_class+private的類,用來實現具體邏輯,暴露給我們的類定義通用的接口.QpluginLoader的內部類是QLibraryPrivate,QLibrary是同一個.

[1]如何加載

bool QLibraryPrivate::loadPlugin()
{
    
if (instance) {
        libraryUnloadCount.
ref();
        
return true;
    }

    
if (load()) {//這里最終調用load_sys()
        instance =    (QtPluginInstanceFunction)resolve("qt_plugin_instance");//注意這里的 qt_plugin_instance,插件里面必然導出該函數名稱
        return instance;
    }

    
return false;
}


bool QLibraryPrivate::load_sys()
{
#ifdef Q_OS_WINCE
    QString attempt 
= QFileInfo(fileName).absoluteFilePath();
#else
    QString attempt 
= fileName;
#endif

    
//avoid 'Bad Image' message box
    UINT oldmode = SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);
    pHnd 
= LoadLibrary((wchar_t*)QDir::toNativeSeparators(attempt).utf16());

    
if (pluginState != IsAPlugin) {
        
if (!pHnd && ::GetLastError() == ERROR_MOD_NOT_FOUND) {
            attempt 
+= QLatin1String(".dll");
            pHnd 
= LoadLibrary((wchar_t*)QDir::toNativeSeparators(attempt).utf16());
        }

    }


    SetErrorMode(oldmode);
    
if (!pHnd) {
        errorString 
= QLibrary::tr("Cannot load library %1: %2").arg(fileName).arg(qt_error_string());
    }

    
if (pHnd) {
        errorString.clear();

        wchar_t buffer[MAX_PATH];
        ::GetModuleFileName(pHnd, buffer, MAX_PATH);
        attempt 
= QString::fromWCharArray(buffer);

        
const QDir dir =  QFileInfo(fileName).dir();
        
const QString realfilename = attempt.mid(attempt.lastIndexOf(QLatin1Char('\\')) + 1);
        
if (dir.path() == QLatin1String("."))
            qualifiedFileName 
= realfilename;
        
else
            qualifiedFileName 
= dir.filePath(realfilename);
    }

    
return (pHnd != 0);
}

[2] qt_plugin_instance是定義導出的呢?

在實現接口時,必須加上Q_EXPORT_PLUGIN2,Q_EXPORT_PLUGIN2 ( PluginName, ClassName )

宏定義:

#  define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS)      \
            Q_PLUGIN_VERIFICATION_DATA \
            Q_EXTERN_C Q_DECL_EXPORT \
            
const char * Q_STANDARD_CALL qt_plugin_query_verification_data() \
            
return qt_plugin_verification_data; } \
            Q_EXTERN_C Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) 
* Q_STANDARD_CALL qt_plugin_instance() \
            Q_PLUGIN_INSTANCE(PLUGINCLASS)
其中
#  define Q_PLUGIN_VERIFICATION_DATA \
    
static const char *qt_plugin_verification_data = \
      
"pattern=""QT_PLUGIN_VERIFICATION_DATA""\n" \
      
"version="QT_VERSION_STR"\n" \
      
"debug="QPLUGIN_DEBUG_STR"\n" \
      
"buildkey="QT_BUILD_KEY;
#define  Q_EXTERN_C extern
#define  Q_DECL_EXPORT __declspec(dllexport)
#define Q_PLUGIN_INSTANCE(IMPLEMENTATION) \
        
{ \
            
static QT_PREPEND_NAMESPACE(QPointer)<QT_PREPEND_NAMESPACE(QObject)> _instance; \
            
if (!_instance)      \
                _instance 
= new IMPLEMENTATION; \
            
return _instance; \
        }
去掉宏之后,是2個函數.
static const char *qt_plugin_verification_data =           "pattern=""QT_PLUGIN_VERIFICATION_DATA""\n"     "version="QT_VERSION_STR"\n" 
    
"debug="QPLUGIN_DEBUG_STR"\n"
          
"buildkey="QT_BUILD_KEY;
extern __declspec(dllexport) qt_plugin_query_verification_data()
{
    
return  qt_plugin_verification_data;
}


extern __declspec(dllexport) QObject* qt_plugin_instance()
{
    Qpoint
<QOjbect> _instance;
    
if (!_instance)
                _instance 
= new PLUGINCLASS;
            
return _instance;
}

[3] instancetypedef QObject *(*QtPluginInstanceFunction)();


這樣就實現了QT的插件.但是還沒完.

在定義接口時,還應加上Q_DECLARE_INTERFACE,This macro associates the given Identifier (a string literal) to the interface class called ClassName. The Identifier must be unique.

#  define Q_DECLARE_INTERFACE(IFace, IId) \
    template 
<> inline const char *qobject_interface_iid<IFace *>() \
    
return IId; } \
    template 
<> inline IFace *qobject_cast<IFace *>(QObject *object) \
    
return reinterpret_cast<IFace *>((object ? object->qt_metacast(IId) : 0)); } \
    template 
<> inline IFace *qobject_cast<IFace *>(const QObject *object) \
    
return reinterpret_cast<IFace *>((object ? const_cast<QObject *>(object)->qt_metacast(IId) : 0)); }
#endif // Q_MOC_RUN

posted on 2010-08-28 19:56 codeArt 閱讀(5740) 評論(0)  編輯 收藏 引用 所屬分類: QT

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統(tǒng)計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

文章檔案

編程與開源

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久在线视频| 欧美日韩综合另类| 亚洲激情一区二区| 久久精品综合| 蜜臀av一级做a爰片久久 | 羞羞答答国产精品www一本| 一区二区三区视频在线观看| 亚洲午夜久久久久久久久电影院 | 亚洲福利专区| 亚洲精品婷婷| 亚洲你懂的在线视频| 欧美一级片一区| 免费不卡在线观看| 亚洲欧洲久久| 午夜国产精品影院在线观看 | 国产伦理一区| 一区二区在线视频观看| 亚洲九九爱视频| 欧美在线播放一区| 欧美激情性爽国产精品17p| 日韩天天综合| 久久久久久久久久久久久久一区| 欧美激情二区三区| 国产日韩欧美一区二区| 国产精品爽爽ⅴa在线观看| 在线高清一区| 日韩亚洲欧美在线观看| 亚洲欧美一区二区在线观看| 浪潮色综合久久天堂| 一本久久综合| 久久精品视频在线观看| 欧美日韩一二三四五区| 精品99视频| 午夜视频在线观看一区二区三区| 欧美二区不卡| 欧美制服丝袜| 国产精品美女在线观看| 亚洲人成免费| 免费日韩av片| 欧美一区2区三区4区公司二百| 欧美精品一区二区三区蜜桃 | 麻豆freexxxx性91精品| 国产精品性做久久久久久| 亚洲免费不卡| 女生裸体视频一区二区三区| 亚洲欧美一区二区激情| 欧美色网一区二区| 亚洲精品日日夜夜| 欧美成人免费全部观看天天性色| 亚洲欧美一区二区三区在线| 国产精品美女一区二区在线观看| 99这里只有久久精品视频| 欧美成人国产一区二区| 久久久国产视频91| 国内精品久久久久久| 欧美一区国产一区| 亚洲免费一在线| 国产精品白丝jk黑袜喷水| 日韩视频免费在线| 亚洲人线精品午夜| 欧美日韩国产一区二区三区| 日韩视频免费在线| 亚洲欧洲日产国产网站| 欧美日韩国产区| 亚洲影院高清在线| 亚洲视频第一页| 国产精品区二区三区日本| 午夜精品一区二区三区在线播放 | 欧美一区二区视频在线| 国产精品视频导航| 欧美一区二区在线免费播放| 性欧美xxxx视频在线观看| 国产在线精品成人一区二区三区 | 国产丝袜一区二区| 欧美一区二区三区在线观看| 亚洲欧美日韩国产一区二区| 亚洲女ⅴideoshd黑人| 亚洲欧美国产不卡| 国产欧美 在线欧美| 久久精品在线视频| 久久午夜羞羞影院免费观看| 亚洲大片一区二区三区| 欧美激情一区二区三区不卡| 欧美韩国一区| 午夜宅男欧美| 久久福利资源站| 亚洲黄色天堂| 中文有码久久| 在线日韩av片| 亚洲午夜精品视频| 在线欧美亚洲| 中文精品视频| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲午夜精品久久久久久app| 洋洋av久久久久久久一区| 国产欧美日韩亚洲精品| 免费av成人在线| 欧美午夜欧美| 欧美成人在线免费观看| 国产精品videossex久久发布| 久久久7777| 欧美日韩理论| 欧美高清在线视频观看不卡| 欧美色精品天天在线观看视频| 久久性色av| 国产精品久久久久久影院8一贰佰| 免费成人在线观看视频| 国产精品日韩一区二区| 亚洲激情另类| 亚洲成色999久久网站| 亚洲无线一线二线三线区别av| 亚洲成人在线网站| 午夜精品美女久久久久av福利| 亚洲美女网站| 麻豆freexxxx性91精品| 久久久国产91| 国产精品稀缺呦系列在线| 亚洲精品久久嫩草网站秘色| 在线观看视频欧美| 亚洲欧美在线磁力| 亚洲自拍电影| 欧美日韩蜜桃| 91久久精品日日躁夜夜躁国产| 国内精品久久久久影院色| 亚洲一级特黄| 亚洲小视频在线观看| 欧美激情精品久久久久久变态| 久久影院午夜片一区| 国产女主播一区二区| 亚洲午夜电影| 香蕉乱码成人久久天堂爱免费| 欧美日韩中文| 一本色道久久精品| 亚洲视频一区二区在线观看| 欧美激情一区二区三区在线视频| 欧美多人爱爱视频网站| 亚洲第一成人在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久激情网站| 国产日韩在线一区二区三区| 亚洲午夜精品网| 亚洲欧美日韩成人| 国产精品久久久久久久久借妻| 99精品热6080yy久久| 亚洲视频在线观看三级| 欧美日韩另类国产亚洲欧美一级| 亚洲美女免费视频| 亚洲一区二区免费视频| 国产精品国码视频| 亚洲男人第一网站| 久久久久久久999精品视频| 国产一区清纯| 久久视频在线视频| 亚洲国产精品久久91精品| 亚洲欧洲综合| 欧美日韩国产亚洲一区| 在线视频中文亚洲| 久久av一区二区三区亚洲| 国内免费精品永久在线视频| 久久伊人免费视频| 亚洲国产专区| 亚洲欧美中日韩| 黄网站免费久久| 欧美精品尤物在线| 亚洲小少妇裸体bbw| 久久综合中文| 一区二区三区|亚洲午夜| 国产精品日韩精品| 久久综合伊人77777| 中国成人黄色视屏| 免费精品视频| 亚洲午夜免费福利视频| 狠狠色综合色区| 欧美视频专区一二在线观看| 久久国产乱子精品免费女| 亚洲国产小视频在线观看| 欧美在线免费一级片| 亚洲激情校园春色| 国产嫩草影院久久久久| 欧美1区2区视频| 欧美伊人久久久久久久久影院| 亚洲国产欧美一区二区三区久久| 性做久久久久久免费观看欧美| 91久久黄色| 国产伦精品一区二区三区高清| 欧美韩国在线| 老司机精品久久| 性欧美暴力猛交另类hd| 亚洲精品视频在线观看网站| 久久久久一区| 午夜精品免费在线| 夜夜夜久久久| 亚洲国产精品久久久久秋霞蜜臀| 国产精品亚洲精品| 欧美日韩精品系列| 久久综合久久88| 久久久国产午夜精品| 午夜日韩在线| 亚洲尤物在线| 亚洲桃色在线一区|