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

kenlistian

厚積薄發(fā). 勤為槳,思為帆

   :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理 ::
  73 隨筆 :: 4 文章 :: 22 評(píng)論 :: 0 Trackbacks

  其實(shí),插件不過就是調(diào)用dll中的函數(shù)而已,不過通過類似一個(gè)com中的接口,再通過接口查詢到相應(yīng)的服務(wù)來處理。

復(fù)雜的插件,當(dāng)然有考慮采用com方式的,不過作為編寫程序的原則是簡(jiǎn)單,實(shí)效,通用。又何須采用太過專業(yè)的方法。

技術(shù)不過是手段,能在達(dá)到目的的最大化程度上實(shí)現(xiàn),就足矣。

  下面的例子來自網(wǎng)上,作者不詳,稍微整編下。直接貼代碼在上面。源碼打包放在自己博客的文檔中。算是自己學(xué)習(xí)整理,

也感謝提供者。

源碼學(xué)習(xí):http://www.shnenglu.com/Files/kenlistian/test_plus.rar

 

1.定義插件的接口結(jié)構(gòu)

/*
  定義一個(gè)plus 接口結(jié)構(gòu)
*/
typedef struct PlugInModule{
    DWORD Ver ;                    //版本
    char *Author ;                  //作者說明
    char *Description;             //模塊說明

    BYTE *InputPointer;          //輸入數(shù)據(jù)
    DWORD dwSize ;               //輸入數(shù)據(jù)的大小
    HWND hParentWnd ;           //主程序的父窗口
    HINSTANCE hDllInst ;          //Dll句柄

    void (*PlugIn_Config)( struct PlugInModule * pModule ); //設(shè)置函數(shù)
    void (*PlugIn_Init)( struct PlugInModule * pModule );    //初始化函數(shù)
    void (*PlugIn_Quit)( struct PlugInModule * pModule );   //退出函數(shù)
    void (*PlugIn_Run )( struct PlugInModule * pModule );   //執(zhí)行函數(shù)
} PlugInModule;

其中接口結(jié)構(gòu)函數(shù),被規(guī)定了4個(gè),也就是說這個(gè)接口函數(shù)定死了,如果以后應(yīng)為功能增加等等,

則估計(jì)這個(gè)結(jié)構(gòu)都要改寫。所以采用com方式接口方式則是一種好的選擇,而那種模式,每次還要注冊(cè)com,

則莫免麻煩和釘死在windows平臺(tái)上。

2.以上接口結(jié)構(gòu)放置在頭文件中。作為主程序和dll共享的頭文件,其中,再在頭文件中具體聲明以上結(jié)構(gòu)體中函數(shù)。

void plusDll_Config( struct PlugInModule * pModule);  //設(shè)置函數(shù)
void PlusDll_Init( struct PlugInModule * pModule );   //初始化函數(shù)
void plusDll_Quit( struct PlugInModule * pModule );   //退出函數(shù)
void plusDll_Run( struct PlugInModule * pModule );     //執(zhí)行函數(shù)

3.在頭文件中聲明一個(gè)返回該結(jié)構(gòu)的函數(shù)。其實(shí)就是一個(gè)回調(diào)函數(shù)。把該結(jié)構(gòu)返回給主程序的一個(gè)export 函數(shù)。

typedef PlugInModule* (*GETPLUGINMODULE)();       //聲明接口函數(shù)地址

/**
  導(dǎo)出函數(shù),主程序首先獲取該接口函數(shù),獲得 dll中的函數(shù)地址,調(diào)用
*/
DLL_001_API PlugInModule* GetPlugInModuleFunction();     //DLL_001_API ==> __declspec(dllexport)

4.在dll中定義該插件結(jié)構(gòu),把地址通過GetPlugInModuleFunction傳入到主程序。

5.分別實(shí)現(xiàn)dll中和主程序的定義部分。通過動(dòng)態(tài)加載方式即可實(shí)現(xiàn)取出dll的結(jié)構(gòu)體指針。

如下示:

        hDLL = LoadLibrary("dll_001\\debug\\dll_001.dll");
        if (hDLL)
                MessageBox(NULL,"plus_Dll load ok", "", MB_OK);
        else
        {                       
                        MessageBox(NULL, "not found plus_dll","",MB_OK);
                        return 0;
                    }
                    pFunction = (GETPLUGINMODULE)::GetProcAddress(hDLL,"GetPlugInModuleFunction");
                    if (pFunction != NULL)
                    {
                       dllplus_module = (*pFunction)();
                          dllplus_module->PlugIn_Init(dllplus_module);
                       dllplus_module->PlugIn_Run(dllplus_module);
                       dllplus_module->PlugIn_Quit(dllplus_module);

                    }
                    ::FreeLibrary(hDLL);//卸載MyDll.dll文件;


評(píng)論

# re: 通用插件程序?qū)懛? 2009-03-11 23:02 黃昏的早晨
例子不錯(cuò)  回復(fù)  更多評(píng)論
  

# re: 通用插件程序?qū)懛?a name="Post"> 2012-05-30 09:55 luoagzn@163.com
您上面說的這個(gè)例子我也調(diào)試過,在我機(jī)器怎么就不行呢?麻煩您幫我看一下我的源碼,有什么問題沒?

我想框架中加入動(dòng)態(tài)庫中的GUI,進(jìn)行插件開發(fā),下面是代碼,為什么wxCreateDynamicObject失敗?請(qǐng)高手解答,謝謝!

=== LIBRARY: plugin.h ===
// My base class for plugins...

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include <wx/dynload.h>
#include <wx/dynlib.h>

#if defined(WXUSINGDLL) && (defined(WXMAKING_MY_DLL) ||
defined(WXUSING_MY_DLL))
#if defined(WXMAKING_MY_DLL)
#define WXP_EXPORTED_FROM_APP_TO_PLUGIN WXEXPORT
#elif defined(WXUSING_MY_DLL)
#define WXP_EXPORTED_FROM_APP_TO_PLUGIN WXIMPORT
#endif
#else
#define WXP_EXPORTED_FROM_APP_TO_PLUGIN
#endif

#define WXDLL_ENTRY_FUNCTION() \
extern "C" WXEXPORT const wxClassInfo *wxGetClassFirst(); \
const wxClassInfo *wxGetClassFirst() { \
return wxClassInfo::GetFirst(); \
}

class WXP_EXPORTED_FROM_APP_TO_PLUGIN Plugin: public wxButton
{
DECLARE_ABSTRACT_CLASS(Plugin)

};

IMPLEMENT_ABSTRACT_CLASS(Plugin, wxButton)

===

=== LIBRARY: test_plugin.h ===
// My test plugin...

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "plugin.h"

class MyPlugin: public Plugin
{
DECLARE_DYNAMIC_CLASS(MyPlugin)

};

WXDLL_ENTRY_FUNCTION();

===

=== LIBRARY: test_plugin.cpp ===

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "test_plugin.h"

IMPLEMENT_DYNAMIC_CLASS(MyPlugin, Plugin)

===

=== APP: test.cpp ===
// My test app

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "wx/dynlib.h"

#include "plugin.h"

#ifdef WIN_DLL
#define TEST_PLUGIN (_T("plugins/test_plugin.dll"))
#else
#define TEST_PLUGIN (_T("plugins/test_plugin.so"))
#endif

class MyApp: public wxApp
{
public:
virtual bool OnInit( void );

};

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit( void )
{
wxFrame *frame = new wxFrame( NULL, wxID_ANY, _T("Test") );

wxDynamicLibrary lib( TEST_PLUGIN );
if( !lib.IsLoaded() )
{
fprintf( stderr, "### wxDynamicLibrary: ERROR ### \n" );
}
else
{
fprintf( stderr, ">>> wxDynamicLibrary: ok <<< \n" );

Plugin *but = (Plugin*)
wxCreateDynamicObject( _T("MyPlugin") );
if( but )
{
but->Create( frame, 500, _T("MyPlugin Button") );
}
else
fprintf( stderr, "### wxCreateDynamicObject: ERROR ###
\n" );
}

frame->Show( true );

return true;
}

===

  回復(fù)  更多評(píng)論
  


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品va在线看黑人| 欧美美女视频| 亚洲一级黄色av| 久久一区欧美| 久久久精品国产免大香伊| 欧美日韩在线一区二区三区| 男人天堂欧美日韩| 国产一区在线观看视频| 亚洲欧美成人精品| 亚洲一区二区3| 欧美日韩国产免费| 亚洲欧洲综合另类在线| 91久久精品www人人做人人爽| 欧美亚洲尤物久久| 欧美呦呦网站| 国产精品伊人日日| 亚洲手机在线| 午夜视频久久久久久| 国产精品二区二区三区| 亚洲社区在线观看| 亚洲一区二区三区免费观看| 欧美体内she精视频| 中日韩午夜理伦电影免费| 一本色道久久综合亚洲二区三区| 欧美激情精品久久久久久免费印度| 欧美成人r级一区二区三区| 在线观看亚洲精品| 久久只有精品| 亚洲承认在线| 9人人澡人人爽人人精品| 欧美日韩国产a| 日韩一区二区久久| 亚洲欧美亚洲| 国产视频精品xxxx| 欧美中文字幕在线观看| 免费永久网站黄欧美| 亚洲国产片色| 欧美日韩综合久久| 亚洲在线电影| 美国十次成人| 日韩亚洲欧美综合| 欧美视频三区在线播放| 午夜电影亚洲| 欧美成人dvd在线视频| 日韩视频一区| 国产精品一区二区在线观看不卡| 久久成人精品无人区| 亚洲第一中文字幕| 亚洲综合激情| 影音先锋一区| 欧美日韩亚洲高清| 亚洲欧美中文在线视频| 欧美成人午夜77777| 亚洲一区黄色| 黄色一区三区| 欧美视频1区| 久久九九久久九九| 亚洲老司机av| 久久免费国产精品| 夜夜嗨av一区二区三区中文字幕| 国产精品网曝门| 欧美成人精品在线| 亚洲视频大全| 欧美激情中文字幕一区二区| 午夜精品国产更新| 亚洲国产精品久久久久婷婷884| 欧美日韩一区在线播放| 久久久精品一区二区三区| 亚洲精品中文字| 久久久夜夜夜| 亚洲欧美日韩一区二区| 亚洲国产精品一区制服丝袜| 国产精品自在欧美一区| 欧美激情中文字幕在线| 久久精品国产成人| 亚洲色图在线视频| 欧美激情精品久久久六区热门 | 亚洲欧美国产精品专区久久| 激情久久久久久久久久久久久久久久 | 中国成人黄色视屏| 欧美国产精品劲爆| 欧美在线你懂的| 亚洲午夜高清视频| 亚洲激情视频| 狠狠色丁香婷婷综合| 国产精品久久久一区二区| 欧美黄色成人网| 久久综合中文字幕| 久久精品电影| 欧美在线免费播放| 亚洲欧美日韩网| 亚洲图片在区色| 99国产精品久久| 亚洲精品乱码视频| 亚洲高清视频在线观看| 欧美 亚欧 日韩视频在线| 久久久久一区二区三区| 久久av一区二区三区| 香蕉成人伊视频在线观看| 这里是久久伊人| 日韩午夜在线播放| 亚洲精品小视频在线观看| 亚洲国产成人精品久久| 亚洲第一福利在线观看| 好吊妞**欧美| 影音先锋一区| 亚洲国产日韩欧美| 亚洲国产一区二区三区在线播 | 久久久久久精| 久久国产一区二区| 久久精品国产一区二区三| 久久国产精品久久精品国产| 久久精品女人天堂| 久久久国产成人精品| 久久女同精品一区二区| 六月天综合网| 亚洲高清不卡在线| 亚洲人妖在线| 一区二区三区**美女毛片| 中文在线资源观看视频网站免费不卡| 在线中文字幕一区| 亚洲午夜激情网页| 性做久久久久久免费观看欧美| 久久精品国产久精国产爱| 久久综合给合久久狠狠色 | 欧美—级高清免费播放| 欧美日韩蜜桃| 国产农村妇女毛片精品久久莱园子 | 一区二区三区亚洲| 亚洲第一网站| 夜夜夜精品看看| 午夜精品网站| 麻豆成人av| 亚洲精品久久久久久久久久久久| 在线亚洲精品| 久久精品一区二区国产| 欧美黄色一级视频| 国产精品免费视频xxxx| 亚洲二区精品| 亚洲一区二区三区高清| 久久天堂精品| 亚洲精品中文字幕有码专区| 亚洲免费在线视频一区 二区| 久久久精品国产一区二区三区| 欧美国产精品一区| 国产精品xvideos88| 一区二区三区在线观看国产| 99精品热6080yy久久| 欧美一区二区三区四区在线观看地址| 麻豆精品一区二区av白丝在线| 亚洲精品免费在线| 欧美主播一区二区三区| 欧美日韩免费看| 在线观看日韩| 欧美亚洲视频在线观看| 亚洲国产精品久久久久婷婷884| 亚洲欧美电影在线观看| 欧美激情视频在线播放| 狠狠久久五月精品中文字幕| 制服诱惑一区二区| 欧美不卡视频| 性欧美18~19sex高清播放| 欧美日韩国产一区| 在线日韩电影| 欧美在线观看视频在线 | 亚洲天堂免费在线观看视频| 免费日韩成人| 激情六月综合| 欧美在线视频免费播放| 一区二区三区久久| 欧美激情一区二区三区在线视频 | 久久午夜精品一区二区| 亚洲午夜av在线| 欧美日韩情趣电影| 亚洲日本激情| 欧美成人小视频| 久久久91精品| 韩国av一区二区三区四区| 香蕉乱码成人久久天堂爱免费| 日韩亚洲国产欧美| 免费看成人av| 亚洲黄色免费| 欧美韩国日本一区| 久久裸体艺术| 海角社区69精品视频| 久久精品综合| 欧美在线啊v一区| 国产一区99| 久久一区二区三区超碰国产精品| 欧美一级理论片| 国产一区二区三区四区五区美女| 久久riav二区三区| 欧美一级视频精品观看| 国产亚洲福利一区| 久久久久久午夜| 久久午夜电影网| 亚洲激情电影在线| 91久久久久久久久| 欧美日韩综合视频网址| 亚洲欧美色婷婷|