工具: 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()来实现。