龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC++实现应用程序对插件的支持(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
为普通应用程序扩展插件支持功能 插件支持功能并非Winamp、RealPlay等大牌软件所独有,任何普通应用程序经过程序编码均可将其扩展为支持插件的应用程序

  为普通应用程序扩展插件支持功能

  插件支持功能并非Winamp、RealPlay等大牌软件所独有,任何普通应用程序经过程序编码均可将其扩展为支持插件的应用程序。通常将这部分扩展代码在主框架类中完成,根据前面所述思路,首先从应用程序所在目录下搜寻子目录PLUGINS下是否存在以动态链接库形式提供的插件,如果在此目录下没有找到动态链接库那么就说明当前还没有插件,因此程序也就不需要做进一步处理,如果找到插件,就一一将其插入到应用程序。搜寻插件的部分代码如下:

……
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开始,依次累加。具体实现可参考如下代码:

int size = m_arrPlugObj.GetSize();
m_ImageList.Create(16, 16, ILC_COLOR32, size + 1, size);
for (int i = 0; i < size; i ++)
m_ImageList.Add(m_arrPlugObj[i].pObj->GetIcon());
CToolBarCtrl& ctrlBar = m_wndPlugBar.GetToolBarCtrl();
ctrlBar.SetImageList(&m_ImageList);
TBBUTTON btn;
for (i = 0; i < size; i ++)
{
btn.iBitmap = i;
btn.idCommand = ID_PLUG_POINTER + i;//command to be sent when button pressed
btn.fsState = TBSTATE_ENABLED; //button state--see below
btn.fsStyle = TBSTYLE_BUTTON; //button style--see below
btn.dwData = 0; //application-defined value
btn.iString = NULL; //zero-based index of button label string
ctrlBar.AddButtons(1, &btn);
}

精彩图集

赞助商链接