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

kenlistian

厚積薄發. 勤為槳,思為帆

   :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理 ::
  73 隨筆 :: 4 文章 :: 22 評論 :: 0 Trackbacks

  其實,插件不過就是調用dll中的函數而已,不過通過類似一個com中的接口,再通過接口查詢到相應的服務來處理。

復雜的插件,當然有考慮采用com方式的,不過作為編寫程序的原則是簡單,實效,通用。又何須采用太過專業的方法。

技術不過是手段,能在達到目的的最大化程度上實現,就足矣。

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

也感謝提供者。

源碼學習:http://m.shnenglu.com/Files/kenlistian/test_plus.rar

 

1.定義插件的接口結構

/*
  定義一個plus 接口結構
*/
typedef struct PlugInModule{
    DWORD Ver ;                    //版本
    char *Author ;                  //作者說明
    char *Description;             //模塊說明

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

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

其中接口結構函數,被規定了4個,也就是說這個接口函數定死了,如果以后應為功能增加等等,

則估計這個結構都要改寫。所以采用com方式接口方式則是一種好的選擇,而那種模式,每次還要注冊com,

則莫免麻煩和釘死在windows平臺上。

2.以上接口結構放置在頭文件中。作為主程序和dll共享的頭文件,其中,再在頭文件中具體聲明以上結構體中函數。

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

3.在頭文件中聲明一個返回該結構的函數。其實就是一個回調函數。把該結構返回給主程序的一個export 函數。

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

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

4.在dll中定義該插件結構,把地址通過GetPlugInModuleFunction傳入到主程序。

5.分別實現dll中和主程序的定義部分。通過動態加載方式即可實現取出dll的結構體指針。

如下示:

        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文件;

posted on 2008-04-21 18:54 kenlistian 閱讀(2028) 評論(2)  編輯 收藏 引用

評論

# re: 通用插件程序寫法 2009-03-11 23:02 黃昏的早晨
例子不錯  回復  更多評論
  

# re: 通用插件程序寫法 2012-05-30 09:55 luoagzn@163.com
您上面說的這個例子我也調試過,在我機器怎么就不行呢?麻煩您幫我看一下我的源碼,有什么問題沒?

我想框架中加入動態庫中的GUI,進行插件開發,下面是代碼,為什么wxCreateDynamicObject失敗?請高手解答,謝謝!

=== 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;
}

===

  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产原创一区二区| 亚洲欧洲日产国产综合网| 国产视频在线一区二区 | 久久久91精品国产一区二区精品| 在线一区视频| 一区二区三区精品视频| 亚洲——在线| 久久久噜噜噜久久中文字免| 久久看片网站| 亚洲高清自拍| 亚洲伊人伊色伊影伊综合网| 亚洲欧美视频在线观看视频| 久久精品国产欧美激情| 六月婷婷久久| 国产精品v欧美精品v日韩精品| 国产精品久久毛片a| 国产日韩精品久久久| 亚洲高清免费视频| 亚洲婷婷综合色高清在线| 久久精品国产一区二区三| 欧美华人在线视频| 亚洲午夜激情网页| 久久综合网络一区二区| 国产精品mm| 久久久久久久性| 两个人的视频www国产精品| 国产女主播一区二区| 亚洲国产精品va在线看黑人动漫 | 最新国产精品拍自在线播放| 中国成人黄色视屏| 欧美成人免费一级人片100| 尤物九九久久国产精品的分类| 欧美成人精品在线观看| 国产精品久久久久一区二区三区共| 国产综合久久久久久| 一本综合久久| 欧美激情综合| 久久精品在这里| 国产精品毛片大码女人| 亚洲精品免费在线播放| 久久噜噜噜精品国产亚洲综合 | 欧美一级片一区| 99精品99久久久久久宅男| 麻豆精品精华液| 伊人久久综合97精品| 国产精品区免费视频| 99riav国产精品| 亚洲国产精品国自产拍av秋霞| 欧美一区免费| 国产精品美女久久久久久免费 | 日韩亚洲欧美中文三级| 欧美激情国产高清| 亚洲国产精品99久久久久久久久| 欧美一区二区日韩一区二区| 亚洲免费av网站| 欧美久久久久久蜜桃| 亚洲国产精品久久久久秋霞蜜臀 | 一区二区三区精品视频| 欧美精品aa| 日韩香蕉视频| 亚洲日韩视频| 欧美日韩亚洲高清| 亚洲一区二区在线播放| 一二三区精品| 国产欧美精品一区二区色综合 | 亚洲国产精品嫩草影院| 久久青青草原一区二区| 亚洲二区在线视频| 亚洲国产日韩欧美综合久久| 女女同性精品视频| 一区二区三区精密机械公司 | 美日韩丰满少妇在线观看| 另类av导航| 美国十次了思思久久精品导航| 在线播放豆国产99亚洲| 久久国产精品毛片| 亚洲高清不卡在线| 欧美精品少妇一区二区三区| 亚洲精选一区二区| 亚洲美洲欧洲综合国产一区| 国产精品成人在线观看| 欧美在现视频| 麻豆精品精华液| 亚洲视频在线一区| 欧美在线免费一级片| 亚洲激情成人| 亚洲午夜久久久久久尤物 | 老牛国产精品一区的观看方式| 亚洲高清视频在线| 99国产精品视频免费观看一公开| 国产精品美女999| 另类春色校园亚洲| 欧美视频一区在线观看| 久久久久久久性| 欧美日韩精品久久| 久久久青草青青国产亚洲免观| 免费亚洲电影| 欧美影院成年免费版| 欧美jizzhd精品欧美喷水| 亚洲专区一区二区三区| 久久综合一区| 久久精品首页| 欧美午夜精品一区| 欧美激情精品久久久久久大尺度| 国产精品久久777777毛茸茸| 猛男gaygay欧美视频| 亚洲一区二区毛片| 香蕉久久夜色精品| 欧美精品久久一区二区| 久久精品亚洲精品| 国产精品美女www爽爽爽| 欧美韩国一区| 一区在线免费| 欧美一站二站| 欧美亚洲网站| 欧美性片在线观看| 91久久精品国产91久久性色tv| 国产婷婷一区二区| 亚洲午夜女主播在线直播| 亚洲精品专区| 免费亚洲一区| 欧美大秀在线观看| 狠狠色狠狠色综合系列| 亚洲一区二区三区在线看| 一区二区三区精品国产| 欧美精品激情blacked18| 欧美激情小视频| 亚洲国产精品久久91精品| 久久久久久久一区二区| 久久亚裔精品欧美| 国产色视频一区| 小嫩嫩精品导航| 久久精品免费观看| 国产农村妇女精品| 一区二区三区在线观看视频| 在线亚洲+欧美+日本专区| 99精品热6080yy久久 | 欧美三区美女| 日韩午夜高潮| 亚洲欧美一区二区三区久久| 欧美日在线观看| 亚洲视频中文| 欧美在线观看一区二区| 国产欧美欧美| 久久久福利视频| 欧美a级理论片| 亚洲精品一级| 欧美日韩第一区日日骚| 一区二区三区不卡视频在线观看| 亚洲一区网站| 国模吧视频一区| 久久一区二区精品| 最新日韩精品| 性欧美18~19sex高清播放| 国产精品视频yy9299一区| 欧美亚洲在线视频| 欧美激情中文字幕一区二区| 亚洲视频axxx| 国内伊人久久久久久网站视频 | 国产欧美一区二区三区在线老狼| 欧美一区三区三区高中清蜜桃 | 香蕉久久夜色精品国产使用方法| 国产日韩欧美一区二区三区四区| 亚欧成人精品| 亚洲激情精品| 欧美主播一区二区三区| 亚洲风情在线资源站| 欧美日韩中文| 久久精品女人| 夜夜躁日日躁狠狠久久88av| 久久成人一区| 一区二区高清| 狠狠色狠狠色综合人人| 欧美伦理在线观看| 久久本道综合色狠狠五月| 亚洲激情一区二区| 欧美在线免费一级片| 91久久夜色精品国产网站| 国产精品久久久久一区二区三区共 | 欧美日韩高清在线播放| 欧美一级淫片aaaaaaa视频| 亚洲二区免费| 久久精品麻豆| 亚洲一区在线观看视频| 亚洲成人原创| 国产女主播视频一区二区| 欧美激情国产日韩精品一区18| 亚洲免费在线视频一区 二区| 亚洲第一成人在线| 久久久欧美精品sm网站| 午夜欧美精品| 亚洲午夜一级| 夜夜嗨av一区二区三区四区| 亚洲成人在线免费| 国产性猛交xxxx免费看久久| 女女同性女同一区二区三区91| 国产日韩亚洲欧美精品| 香港久久久电影| 这里只有精品丝袜| 亚洲精品国产无天堂网2021|