Codejie's C++ Space

Using C++

LingosHook:Plugins


    LingosHook最近的版本发布有五个多月了,下载量也超过2500了~看来Lingoes真的很流行,单词本真的很需要啊。。。

    从目前得到的反馈情况看,有一半多的都是增强功能。如果把这些功能一一加到LingosHook中,总感觉会使其变得臃肿,甚至可能就偏离了作为单词本的主线了。但有些功能确实可以很有用的,比如单词的导出,等等。
    既要添加功能,又不能影响原有的框架,想来想去,总没有个好的方案。几天前LP收拾书柜时忽然问我--“Delphi你还会吗?”接过两本厚厚的《Delphi5 开发指南》,突然就想起十年前曾用Delphi开发的CBE(Cell Broadcast Equipment,不知道是否有人记得这个。。)程序来,那其中用到的‘Plugins’方法应该可以解决这个问题。
    这个‘Plugins’--看着和说着都很好听,当然了,当时确实也很得意。实际说起来原理很简单,就是动态加载DLL,利用DLL封装所需功能。不过现在想想,那时自己还真的很有想象力啊,因为当时只是听说过‘Plugins’技术,从来不知道该怎么做,总觉得应该是个非常非常高深的技术,都没敢去研究过。自己把这种DLL叫做‘Plugins’,也只是‘赶潮流’,傍个好听的名字便于去吹牛而已,没想后来发现这还真是一种Plugins的实现方式,非常地惊讶。。。
    当然了,自己的这个‘Plugins’实际就是简单的DLL调用,原理很简单--定义几个标准接口,作为‘Plugins’的DLL实现这些接口,然后应用扫描指定的DLL文件,并检查这些接口是否存在,如果存在,就加载到应用中,使用是,调用定义好的接口来完成所需功能。

    下面是定义的接口类:

#ifndef __ACTIVITYOBJECT_H__
#define __ACTIVITYOBJECT_H__

#include 
"wx/wx.h"

class CDBAccess;

class ActivityObject
{
public:
    
struct PropertyData
    
{
        wxString m_strLabel;
        wxString m_strName;
        wxString m_strVersion;
        wxString m_strAuthor;
        wxString m_strDescription;
        wxString m_strDetail;
    }
;
public:
    ActivityObject();
    
virtual ~ActivityObject();

    
virtual int Init(int fparam = 0int sparam = 0return 0; }
    
virtual void Final() {}

    
virtual int LoadProperty(PropertyData& data) const = 0;

    
virtual int Run() = 0;

    
virtual bool NeedDBAccess() const return false; }
    
virtual bool NeedTagAccess() const return false; }

    
void SetDBObject(CDBAccess* obj);
protected:
    CDBAccess
* _objDBAccess;
}
;

#endif

    然后是调用接口的代码:
int CPluginObject::LoadPlugin(int index, const wxString &plugfile)
{
    wxDynamicLibrary lib(plugfile);
    
if(!lib.IsLoaded())
        
return -1;

     GetActivityPtr ptr 
= (GetActivityPtr)lib.GetSymbol(wxT("GetActivity"));
     ActivityObject
* act = ptr();
     ActivityObject::PropertyData data;
     
if(act->LoadProperty(data) == 0)
     
{
         _mapActivity.insert(std::make_pair(index, plugfile));

         g_objTrigger.OnPluginLoad(index, data);
     }

     lib.Unload();

     
return 0;
}

   具体功能实现代码在这里:
class WordExport : public ActivityObject
{
public:
    WordExport();
    
virtual ~WordExport();

    
virtual int Init(int fparam = 0int sparam = 0return 0; }
    
virtual void Final() {}

    
virtual int LoadProperty(PropertyData& data) const;

    
virtual int Run();

    
virtual bool NeedDBAccess() const return true; }

}
;

extern WordExport* _theActivity;

#include <windows.h>

#include 
"Exports.h"
#include 
"WordExport.h"

LINGOSHOOK_PLUGINS_API ActivityObject
* GetActivity()
{
    _theActivity 
= new WordExport();
    
return _theActivity;
}


int DLLInit()
{
    
return 0;
}


void DLLFinal()
{
    
if(_theActivity != NULL)
        delete _theActivity, _theActivity 
= NULL;
}


///////////
BOOL APIENTRY DllMain(HANDLE hModule, DWORD uCallReason, LPVOID pReserved)
{
    
switch(uCallReason)
    
{
    
case DLL_PROCESS_ATTACH:
        
if(DLLInit() != 0)
            
return FALSE;
        
break;
    
case DLL_THREAD_ATTACH:
        
break;
    
case DLL_THREAD_DETACH:
        
break;
    
case DLL_PROCESS_DETACH:
        DLLFinal();
        
break;
    
default:
        
return FALSE;
    }
;

    
return TRUE;
}


////

WordExport
* _theActivity = NULL;


WordExport::WordExport()
: ActivityObject()
{
}


WordExport::
~WordExport()
{
}


int WordExport::LoadProperty(PropertyData& data) const
{
    data.m_strLabel 
= wxT("WordExport");
    data.m_strName 
= wxT("Word Export");
    data.m_strVersion 
= wxT("0.0.1");
    data.m_strAuthor 
= wxT("codejie");
    data.m_strDescription 
= wxT("Export words from LingosHook to a Text file.");
    data.m_strDetail 
= wxT("NONE.");

    
return 0;
}


int WordExport::Run()
{
    
return -1;
}


    运行时的样子如下:


    怎么样,挺像回事吧。。。

posted on 2010-12-29 01:10 codejie 阅读(1952) 评论(1)  编辑 收藏 引用 所属分类: C++轮子精神LingosHook

评论

# re: LingosHook:Plugins[未登录] 2010-12-29 11:22 潘孙友

灰常像样了,呵呵  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

Using C++

导航

统计

留言簿(73)

随笔分类(513)

积分与排名

最新评论

阅读排行榜

评论排行榜