剖析外掛技術 (轉)

gugu99發表於2008-05-24
剖析外掛技術 (轉)[@more@]

剖析技術

作者:太子

to: tablejiang@21cn.com">mailto: tablejiang@21cn.com

轉載請保證文件的完整性。

很多人對外掛技術很感興趣,這兩天我對器的外掛技術的原理做了些研究,現在就把
一些心得寫出來。

外掛原理就是透過統一的介面來不同的模組,以實現不同功能的呼叫。用來擴充
主程式的功能。

現在我們來談談它的實現。

外掛技術的實現,一般都是先定義好一個介面結構。這個結構包含了主程式要引用的接
口的指標。當然,這些介面函式的格式必須是事先定義好了的。

而在外掛Dll中一般只有一個匯出函式,利用這個匯出函式,我們可以得到介面結構的指標。

這樣主程式就可以透過指標來使用外掛模組中的功能了。

舉個例子:

我們先定義好包含介面函式的結構:

typedef struct PlugInModule{
 D Ver ; 本
 char *Author ; 者說明
 char *Description;  塊說明
 BYTE *InputPointer; 入資料 [in/out]
 DWORD dwSize ; 入資料的大小 [in]
 HWND hParentWnd ; 視窗 [in]
 HINSTANCE hDllInst ; 控制程式碼 [in]
 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 ;

還有申明Dll的匯出函式:

typedef PlugInModule* (*GETPLUGINMODULE)();

這樣,我們就定義好了一個外掛的介面。


在外掛Dll中,可以這樣實現。

申明和定義介面函式。
數定義
void JhmDll_Config( struct PlugInModule * pModule ) ; 置函式
void JhmDll_Init( struct PlugInModule * pModule ) ; 始化函式
void JhmDll_Quit( struct PlugInModule * pModule ) ; 出函式
void JhmDll_Run( struct PlugInModule * pModule ) ; 行函式

塊函式實現
void JhmDll_Config( struct PlugInModule * pModule )
{
 char szDisplay[260] ;
 sprintf( szDisplay , "%s , config 模組" , pModule->Description ) ;
 MessageBox( NULL , "config" , pModule->Author , MB_OK ) ;
}

void JhmDll_Init( struct PlugInModule * pModule )
{
 char szDisplay[260] ;
 sprintf( szDisplay , "%s , Init 模組" , pModule->Description ) ;
 MessageBox( NULL , "Init" , pModule->Author , MB_OK ) ;
}

void JhmDll_Quit( struct PlugInModule * pModule )
{
 char szDisplay[260] ;
 sprintf( szDisplay , "%s , Quit 模組" , pModule->Description ) ;
 MessageBox( NULL , "Quit" , pModule->Author , MB_OK ) ;
}

void JhmDll_Run( struct PlugInModule * pModule )
{
 char szDisplay[260] ;
 sprintf( szDisplay , "%s , Run 模組" , pModule->Description ) ;
 MessageBox( NULL , "Run" , pModule->Author , MB_OK ) ;
}

這樣,我們就定義好了介面函式。
當然,我們必須把它們加入到介面結構中去。

這樣,再定義一個介面結構,並同時初始化:
始化介面
PlugInModule module =
{
 0x0100 ,
 "Table.JHM.太子" ,
 "示範外掛技術1--空模組" ,
 NULL ,
 0 ,
 NULL ,
 NULL ,
 JhmDll_Config ,
 JhmDll_Init ,
 JhmDll_Quit ,
 JhmDll_Run ,
};

然後再定義Dll的匯出函式
件的介面
#ifdef __cplusplus
extern "C"
{
#endif

__declspec( dllexport ) PlugInModule *GetPlugInModuleFunction()
{
 return &module;
}

#ifdef __cplusplus
}
#endif

這樣,一個外掛dll的介面功能就完成了,當然,你需要在介面函式中新增你的外掛功能程式碼。

這樣主程式再透過動態載入Dll,對映匯出函式地址, 就可以透過匯出函式
GetPlugInModuleFunction()得到一個PlugInModule結構的指標。而PlugInMoudle包含外掛功能
的功能函式地址,這樣就可以引用
void JhmDll_Config( struct PlugInModule * pModule ) ; 置函式
void JhmDll_Init( struct PlugInModule * pModule ) ; 始化函式
void JhmDll_Quit( struct PlugInModule * pModule ) ; 出函式
void JhmDll_Run( struct PlugInModule * pModule ) ; 行函式
這些外掛函式的功能了。

這只是個人想法,如果有不同意見的可以 。歡迎討論。

如果需要更詳細的內容,大家可以到.51"> 或 ft.51.net"> 去
示範。

 

 

 

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004496/,如需轉載,請註明出處,否則將追究法律責任。

相關文章