VC++实现应用程序对插件的支持
2008-11-14 19:35:49 来源:WEB开发网……
GetModuleFileName(NULL, filename, MAX_PATH); // 获取应用程序路径
strPath = CString(filename); //设定当前目录下的子目录PLUGINS
strPath = strPath.Left(strPath.GetLength() - CString(AfxGetAppName()).GetLength() - 4) + CString("PLUGINS");
CString strFindFile = strPath + "*.dll";
// 搜寻子目录PLUGINS下的所有动态链接库
WIN32_FIND_DATA wfd;
HANDLE hf = FindFirstFile(strFindFile, &wfd); //寻找第一个
if (hf != INVALID_HANDLE_VALUE)
{
// 如发现插件就将其插入到本应用程序
CreatePlug(strPath + "" + wfd.cFileName);
while (FindNextFile(hf, &wfd)) //继续寻找下一个
CreatePlug(strPath + "" + wfd.cFileName);
FindClose(hf); // 结束搜寻
}
其中,CreatePlug()函数负责将插件装载到应用程序,其参数指定了待装载的插件的绝对路径。在实现时,首先通过LoadLibrary()函数将插件模块装载到内存,并将获取到的实例句柄保存到PLUG_ST结构的hIns中,最后将此结构对象添加到CArray模板类对象m_arrPlugObj中,主要实现代码如下:
PLUG_ST stPs;
ZeroMemory(&stPs, sizeof(stPs));
stPs.hIns = LoadLibrary(szPlug);
PFN_Plug_CreateObject pFunc = (PFN_Plug_CreateObject)GetProcAddress(stPs.hIns, _T("Plug_CreateObject"));
if (pFunc((void **)&stPs.pObj))
m_arrPlugObj.Add(stPs);
同用户交互部分,则采取这样的处理:将所有插件的图标从插件动态链接库中提取出来,并放置于图象列表,最后在浮动工具条上创建对应的按钮并将插件图标绘制其上。同样也是出于对后期插件的不可预知性,在工具条上创建按钮的资源ID从ID_PLUG_POINTER开始,依次累加。具体实现可参考如下代码:
更多精彩
赞助商链接