工具: D:\Tools\GUIDGEN.EXE 這是安裝vs6.0時的一個工具,只要生成的一個獨一無二的ID號。
生成ID後,用作plg的ID字串,如:#define XML_PLG_ID _T("66D1345F-8341-41eb-A09E-A1C7A82E4C2D")
對外通常有一個interface的頭文件,以if.h 結尾,裏面是一個結構體,成員都是函數指針。如:
typedef HANDLE (*pLoad) (LPCTSTR lpFileName);
。。。
typedef struct _tag_XML_FUN
{
pLoad Load;
。。。
}XML_FUN;
而在 .c文件裏面,提供以下函數:
//先完成你想做的事
HANDLE Load(LPCTSTR lpFileName)
{
CMarkup* mark = new CMarkup;
mark->Load(lpFileName);
return (HANDLE)mark;
}
//生成此結構體的一個全局變量
XML_FUN g_XmlFun; extern "C"
{
void* GetInterface()//對外的函數
{
//將你的函數的入口賦給結構體的成員
g_XmlFun.Load =Load ;
。。。
//將結構體的地址返回
return (void*)&g_XmlFun;
}
};
這樣,GetInterface()會將結構體的地址返回調用者。
那麼如何將其生成plg文件呢?
在創建工程時,在application settings時候,application type 選擇DLL。
然後創建成功
在設置工程屬性時:
填寫output文件爲plg:
當執行Built時候,就可以在指定的路徑生成plg文件了。
那麼怎樣使用呢?
這還用到另外一個封好的插件,但可以進到裏面看其實現方式。
先在應用程序裏面調用下面的函數,將最開始的插件導入:
#define PLUGIN_VECTOR_NAME _T("PlgVector.plg") //劉工做的插件
static Plugin_Man_Fun* LoadPluginCenter()
{
TCHAR szPath[MAX_PATH] = _T("");
GetAbsPathName(PLUGIN_VECTOR_NAME, szPath);
HMODULE hMod = LoadLibrary(szPath);
if(hMod == NULL)
{
// MessageBox(szPath);
return NULL;
}
pGetPluginMan pFun = (pGetPluginMan)GetProcAddress(hMod, _T("GetPluginMan"));
return pFun();
}
這個插件只是用vector<PluginMan> _plgs 此向量來做一個插件管理,管理插件的查找,加入,刪除等等。庫的導入是用
上面的LoadLibrary(szPath)和 GetProcAddress()來實現。