基于VC的插件技术在地震数据处理系统中的应用

第7卷第1期2010年2月
CHIN ESE JO U RN A L O F EN GI NEERIN G G EOP HY SICS
V ol  7,N o  1Feb  ,2010
文章编号:1672 7940(2010)01 0060 07doi:10.3969/j.issn.1672-7940.2010.01.012
基于VC 的插件技术在地震数据
处理系统中的应用
姬广忠1,朱培民1,方 波2,海 洋1
(1.中国地质大学地球物理与空间信息学院,武汉430074;2.武汉特瑞升电子科技有限公司,武汉430074)
作者简介:姬广忠(1983-),男,硕士研究生,从事地震波数值模拟研究及软件开发。E-mail:jj-gg-zz@163
摘 要:软件开发中,一个很重要的问题是软件的维护和后期扩展,若不能扩展,则需要不断地更新换代,用
户原有地程序只能作废。另外,用户不能加进自己的功能来满足自己的需要,使用上欠方便,对地球物理软件也是如此。插件技术可以十分有效地解决上述问题。应用插件技术,对于地球物理软件的扩展性会有很大的提升。本文介绍了插件技术的方法与实现,并编写了一个基于VC++  6.0平台简单的应用插件技术的地震数据处理程序,测试证明效果良好。文章最后对如何优化地震数据处理插件系统提出了建议。
关键词:插件;动态链接库;地震数据处理中图分类号:P 631.4
文献标识码:A
收稿日期:2010-01-13
Application of Plug-in Technology Based on VC to the
System of Seismic Data Processing
Ji Guangzhong 1
,Zhu Peimin 1
,Fang Bo 2
,H ai Yang
1
(1.I nstitute of Geop hy sics and Geomatics ,China Univ er sity of Geosciences ,Wuhan 430074,China;
2.W uhan T er uisheng Electr onic L td.,Wuhan 430074,China)
Abstract:A very important issue of so ftw are development is the maintenance and ex pan  sion.If softw are can no t be expanded,it needs to constantly upgrade them,so the original softw ar e of users are only void.In addition,users can not add their ow n functions to m eet their o w n needs,so it is not quite convenient to be used.H ow ever,Plug  in technolo gy is a very effective w ay to so lve the pr oblems.T he application of plug  in techno logy used in g eo  physical softw are w ill be a signif
icant improvem ent for g eo physical softw are.T his paper is to intr oduce the metho d and realizatio n o f plug  in technolog y,and to w rite a simple pro  g ram based on VC ++6.0platform using plug  in technolog y in seismic data pro cessing.The test has proved that the effect of plug  in technolog y is goo d.Finally ,the adv ice is g iv  en to ho w to optimize plug  in system of seismic data processing.Key words:plug  in;dynamic link library;seismic data processing
1 引 言
在实际应用软件和商业软件的开发过程中,常常面临一个两难的矛盾,即用户需求的复杂多变与软件扩展和重用的复杂性。基于对象的插件技术是在插件的函数型接口和动态库调用的基础上,为解决用户对软件功能尤其是GU I(Graph ical User Interface)对象及其操作的多样化需求,结合面向对象的系统分析思想和client/serv er的结构思想提出的一种软件进程内扩展技术[1]。插件的本质是在不修改程序主体的情况下增加软件功能[2],当插件的接口被公开后,任何公司或个人都可以自己制作插件来解决一些操作上的不便或增加一些新功能。Window s下的插件机制,为地震处理系统的软件更新和功能扩展提供了一种良好的技术。本文的工作就是一种利用插件技术来实现Window s下地震处理系统软件的尝试。
2 插件技术的基本原理
一个可以挂接插件的软件系统[3],通常包括主程序(host)和插件(p1ug in)组两个部分。主程序即是包含!插件的程序,插件必须实现若干标准接口,由主程序在与插件通信时调用。
1)主程序:在Window s平台上,主程序是一个可独立运行的可执行程序,接受插件提供的服务并提供给用户,是整个系统的基础和主干。它的作用有:∀负责启动整个系统,完成插件管理功能,在系统启动时搜索与识别系统中所有插件,得到插件的图标、资源描述、名称与插件的标志等,完成插件的注册,保存插件信息以供后续使用; #负责加载和卸载插件(即完成插件管理的功能),完成插件接口的初始化,并处理系统异常,保持系统的健壮性;∃负责向外界提供使用插件功能的界面,通过接口调用插件函数。
2)插件:能够动态地插入到宿主程序中,拓展软件系统功能。插件通过主程序(可挂接插件的软件系统)的接口,完成与主程序中的插件管理程序的通讯与交互的过程,并提供自己的信息给主程序。
所以,可挂接插件的软件系统的实现主要包括两方面:∀是主体程序的插件处理机制,用来初始化插件,管理好每个插件接口;#是插件的接口函数定义,将所有的插件接口函数进行封装,以便开发者自由调用。
可挂接插件的软件系统实现的关键是插件和主程序之间的交互。独立的主程序和插件能够互相结合在一起工作,必须有一套互相协作的规则和协议,使不同来源的程序互相协调工作。这些规则和协议称
为插件系统的接口。
插件可以由动态链接库(Dynamic Link Li brary,DLL)[4,5]实现,主程序根据接口规则,调用插件的功能,同时还可将任意插件接口在内存中的地址传递给每个插件,插件则根据这些地址来调用其他插件函数,完成所需功能、获取所需资源等[6,7]。
3 地震处理插件系统总体设计
3.1 地震处理系统的基本需求
四川省工商行政管理局地震处理系统主要包括数据的输入、输出和数据处理3个部分。数据输入包括识别各种格式的地震数据,并将数据加载进内存;数据输出包括屏幕输出、绘图和文件保存。
在数据处理中,处理功能由插件完成,其中最重要的部分是数据流在整个程序中的流动,主程序需要将插件所需要处理的数据和相关信息,通过接口传递给插件;而插件也将处理后的数据和相关信息,通过接口反馈给插件。
每个地震处理功能模块能够独自完成一种或多种处理工作。
地震处理还需要能够完成批处理的功能,即组织多个地震处理功能模块,一次性地完成某个处理任务。
3.2 地震处理系统设计的基本思想
巫语根据插件实现的机制,把地震处理系统分成两部分。第一部分是主程序,负责管理和加载地震处理功能模块,建立处理流程和组织处理流程。第二部分是处理功能模块,全部设计成插件,并由动态链接库实现。因此,主程序中的地震处理功能模块管理和加载,实际上就是插件的管理和加载。
为了方便主程序和处理模块(插件)之间,处理模块(插件)和处理模块(插件)之间的通讯,以及数据传输,需要制定通讯和数据传输的规则和协议,统称为接口。
另外,主程序应该记录程序(包括插件)运行
61
第1期        姬广忠等:基于VC的插件技术在地震数据处理系统中的应用
过程中产生的信息、错误、错误处理,并将其写到日志文件中,以备用户查询。主程序还应该响应帮助事件,提供帮助信息和提示信息的显示。3.3 地震处理插件系统的接口设计
插件系统主程序和插件之间需要传递数据和信息,所以需要设计一数据结构,能够将所有插件所需要的数据和信息包含进来。数据结构要针对地震数据文件格式设计,用以传递插件模块所需要的参数、
数据存储地址和其它信息。接口中应含有数据主要的道头信息、输入文件地址、数据内存地址、画图函数地址,以及其它插件的内存地址。具体实现请参照下一节的地震数据处理插件系统的数据结构部分。
4 可挂接插件的地震数据处理
系统实现
为了完成地震处理的功能,关键的程序实现如下:
1)插件系统所完成的功能基于菜单命令响应事件。菜单和功能做在DLL 里,加载进主程序的菜单可以是主菜单项,也可以加载在已有菜单下。但插件菜单的ID(Identification)号不能和主程序重复,插件之间可以重复(图1)
图1 插件系统实现框图
Fig.1 T he framew or k o f plug  in system im plemented
2)主程序启动时,搜索并加载插件模块。调用DLL 的初始化函数向主程序增加界面接口元
素(本例是加菜单),并保存DLL 句柄及DLL 主菜单名。
3)在主程序中,当点击与插件相关联的菜单命令时,就会触发调用插件函数的事件,即使用主函数中所保存的插件信息调用插件中的功能函数。
4)设计一个相对简单的编辑、编译子系统来完成多个插件的组织,并形成一个流程,使处理变得简便快捷。
下面是一个简单的地震数据处理程序(插件系统)的具体实现过程:4.1 插件接口结构
接口结构PlugInMo dule 的前两项存放主菜单数和主菜单名,用于主程序点击菜单时到菜单所属的插件DLL,后三项是初始化函数,执行函数和退出函数[7]。//插件接口结构
typedef struct Plug InM odule {
int  M ainM enuCount;  //主菜单数char  M enuName[3][50];//主菜单名存储在字符串数组中,这里暂定3个处理功能菜单
void (*PlugIn_Init)();//插件初始化函数
void (*Plug In _Run )(U INT ,DllFun  Struct);//执行数据处理的总函数,包含各种功能子函数,参数为ID,DllFunStruct 结构
void (*PlugIn_Quit)();//插件退出函数,当程序退出时释放插件资源}PlugInM odule;4.2 传递数据结构
此项根据数据格式来设定,如地震数据,数据结构中一般包括道头、卷头信息及文件地址等。4.3 插件DLL 的制作
以地震数据绘图插件为例,插件含有一个主菜单 显示方式!,下面有两个子菜单 右边面积图!和 曲线图!(部分代码略)。
1)声明插件接口结构(同(1));
2)声明传递的数据结构(部分代码):struct DllFunStruct
{
CT RLparasStruct  CT RLparas;//地震数据信息存储结构
PLU G_ST  ArrPlug Obj[10];//其他插件的信息存储结构
62
工程地球物理学报(Chinese Journal of Eng ineering Geo physics)      第7卷
vo id  (*Paint1)(flo at**,CDC*); //传递主程序的绘图指针
CString  *Er rMessage;//返回错误信息 CString  *hH elp;//帮助信息
}dna双螺旋
3)声明函数:
void Init();
void Run(U INT ID,DllFunStruct Dll Fun);
void Quit();
void YouBianM ianJiT u(DllFunStruct DllFun);//右变面积图
void QuXianTu(DllFunStr uct Dll Fun);//变曲线图
void OnQingKong(DllFunStruct Dll Fun);//清空视图
4)定义接口结构变量,赋初值:
PlugInModule PlugInterface=
{
1, //菜单数为1
{"显示方式","",""},//菜单名
Init,Run,Quit,//调用的函数
};
5)制作菜单,和单文档界面编程做法一样;
6)添加声明函数代码(以下为主要函数代码):
void Init()//插件初始化,向主程序界面装入菜单
{
CM enu addmenu,*mainmenu;
if(!addm enu.LoadM enu(IDR_M ENU1))  //装入菜单资源。
{
AfxM essag eBox("菜单装入失败!");
r eturn;//如装入失败,显示消息框,且返回。
}
CString str="显示方式";//要增加的菜单项的标签。
mainm enu=Afx GetMainWnd()->Get M enu();//取得指向窗口菜单的Cmenu对象的指针。
int M P=mainmenu->GetM enuItem Count();//菜单插入位置
mainm enu->InsertM enu(MP-2,MF_ POPU P|MF_BYPOSITION|M F_ST RING, (UINT)addm enu.GetSubM enu(0)->m_ hM enu,str);
mainm enu->Detach();//将窗口菜单与Cmenu对象分离。
addm enu.Detach();//将资源菜单(IDR_ MENU1)与Cmenu对象分离。
Afx GetM ainWnd()->Dr aw M enuBar(); //重画菜单。
}
void Run(UINT ID,DllFunStruct Dll Fun)//调用插件函数
{
switch(ID)
{
case ID_Rg htareaChg: YouBianM i anJiT u(DllFun); break;//右边面积!菜单ID号
case ID_LineChg :  QuXianTu( DllFun); break;//曲线图!菜单ID号
case ID_Q ingKo ng:  OnQingKong( DllFun); break;//清空视图!菜单ID
default: break;
}
}
7)在结构指针函数中导出赋值的接口结构地址:
ex ter n"C"__declspec(dllexport)PlugIn M odule*GetPlug InM oduleFunction()
{
return&Plug Interface;
}
4.4 动态加载插件
主程序初始化时搜寻PLUGINS文件夹里面的插件DLL,并加载,调用Dll中的初始化函数(向主窗口中加菜单),将DLL的模块句柄及菜单名存储在CArray类m_arrPlug Obj变量中: void CMy View::OnDraw(CDC*pDC)
{
CString strPath;
char filenam e[M AX_PAT H];
GetM oduleFileName(NULL,filename,MAX _PAT H); //获取应用程序路径
63
第1期        姬广忠等:基于VC的插件技术在地震数据处理系统中的应用
str Path=CString(filename);//设定当前目录下的子目录PLU GINS
str Path=strPath.Left(strPath.GetLeng th() -CString(AfxGetA ppN am e()).GetLength() -4)+CString("P
LUGINS");
CString strFindFile=strPath+"\\*.dll"; //搜寻子目录PLUGINS下的所有动态链接库 WIN32_FIND_DATA w fd;
H AN DLE hf=FindFirstFile(strFind File,&w fd);//寻第一个
if(hf!=INVA LID_H ANDLE_VALUE) {
//如发现插件就将其插入到本应用程序
Cr eatePlug(strPath+"\\"+w fd. cFileName,w fd.cFileNam e);
w hile(FindNextFile(hf,&w fd))//继续寻下一个
Cr eatePlug(strPath+"\\"+w fd. cFileName,w fd.cFileNam e);
FindClo se(hf);//结束搜寻
}
//将插件插入到本应用程序
CA rray<PLUG_ST,PLUG_ST&> m_ar r PlugObj;//动态存储Dll信息,全局变量
vo id CreatePlug(CString strPlug,CString dll name)
{
PLU G_ST Dllhins;
Dllhins.hIns=LoadLibrary(strPlug);//加载DLL
if(!Dllhins.hIns) r eturn;
ty pedef Plug InM odule*(*GET PLUGIN M ODU LE)();//定义结构函数指针
Plug InM odule *Init;
GETPLU GINM ODU LE pInterface;
pInterface=(GETPLU GINM ODULE)Get ProcAddress(Dllhins.hIns,"GetPlug InM odule Functio n");
Init=pInterface(); //取得Dll中GetPlug InM oduleFunctio n函数的地址
66393int MenuCount=Init->M ainMenuCount;
for(int i=0;i<M enuCount;i++)//将Dll的模块句柄及菜单名存储在CA rray类m_arrPl ugObj变量中 {
fo r(int j=0;j<50;j++)
Dllhins.DllM enuNam e[j]=Init->M enu N am e[i][j];
m_arrPlugObj.A dd(Dllhins);
}
Init->Plug In_Init(); //调用DLL中的初始化函数
}
4.5 子菜单弹出事件
在运行主程序时,由WM_OnInitM enuPop up()事件通过添加代码得到弹出菜单名,判断是否是插件的菜单,若是则记录在Cur rentMenu字符串中,实现代码如下:
CString CurrentM enu;//存储当前弹出菜单名,全局变量
void CM ainFr am e::OnInitMenuPopup(CM enu *pPopupMenu,UINT nIndex,BOOL bSy sM enu)
{
CFrameWnd::OnInitMenuPopup(pPopup M enu,nIndex,bSysM enu);
CM enu*m ainmenu;
CString str;
m ainmenu=GetM enu();//取得指向窗口菜单的Cmenu对象的指针。
m ainmenu->GetM enuString(nIndex,str, MF_BYPOSIT ION);//取得菜单名
CurrentM enu=str;
}
4.6 子菜单触发事件
点击子菜单项时,若是插件子菜单,响应ON _COMM AND_RANGE(0,60000,OnPlugH it)中的OnPlu
gH it函数,OnPlugH it函数搜索第4步中存储有DLL的模块句柄和菜单名CAr ray 类变量m_arr PlugObj的元素哪一项的菜单名和第5步中CurrentM enu记录的弹出菜单名相匹配,出此项,即可得到此DLL的句柄,然后就可以调用此DLL中的v oid Run(U INT ID,Dll FunStruct DllFun)函数,传递子菜单ID号和数据结构,v oid Run()函数根据ID号执行对应的函数。ID范围可自己设定,只要不和主程序重复,一般可设置一个没有主程序ID号的范围。
void CM yV iew::OnPlugH it(U INT nID)//
64      工程地球物理学报(Chinese Journal of Eng ineering Geo physics)      第7卷
nID是点击菜单的ID号,由ON_COMM AND_ RANGE()获得并传给此函数
{
int size=m_arrPlug Obj.GetSize();
for(int i=0;i<size;i++)
{
if(CurrentM enu==CString(m_arrPlugObj [i].DllM enuName))//搜索和主菜单名匹配的Dll
{
typedef PlugInModule*(*GETPLU G INM ODULE)();
Plug InM odule *Init;
GETPLU GINM ODULE pInterface;
pInterface=(GET PLUGINMODU LE) GetPro cAddress(m_arr PlugObj[i].hIns,"Get PlugInM oduleFunction");
Init=pInterface();
Init->PlugIn_Run(nID,DllFun);//调用Dll的void Run函数
retur n;
}
}
}
4.7 退出程序:D estro y W indow()或Q u it菜单事件
响应Destro yWindow()或Quit菜单事件,释放主程序资源及调用插件的vo id Quit()函数释放插件资源。陈小蒙
5 可挂接插件的地震数据处理
系统示例
由于篇幅所限,作为一个示例,笔者开发了一个能实现几个基本功能的地震数据处理系统,地震处理的功能由插件实现,目的是用此例说明如何利用插件技术来构造一个地震处理系统。主程序只是一个单文档框架,完成后台协调和调用插件的功能,可处理su和seg y格式的地震数据。这个主程序具有动态加载插件和便捷的扩展功能,只要是按接口要求设计成的插件,均可被主程序自动加载,任何人都可以编写自己的插件来实现需要的功能。
主程序启动时,扫描地震处理插件(动态链接
库),并添加到主菜单,或在已有的主(子)菜单项添加子菜单项。
1)当主程序没有加进插件,即程序的插件文件夹没有放入插件时,程序运行视图为(图2),可以看到只有平台自动生成的菜单,没有增加任何菜单。
图2 未加载插件程序运行视图
Fig.2 T he view o f pr ocedures to run
w hen not dow nload plug ins
2)当把插件加进程序的插件文件夹内,运行程序(图3),可以看到增加了几项主菜单。其中,批处理!插件按照接口规则依次调用了数据预处理!、滤波!和显示方式!三个插件的函数,相当于依次点击这三个菜单命令。
3)点击打开!菜单,导入数据文件,点击相应的菜单,即可调用插件功能。本程序运行流畅,插件系统设计正确、可行。
图3 加载插件程序运行视图
Fig.2 T he view o f pr ocedures to run
when do wnlo ad plug ins
6 结论与建议
脏弹示例程序证明插件技术应用于地震数据处理软件是可行的,提高了程序的扩展性,使程序维护更加方便。插件还有其它许多实现方式,选择的开发语言也很多样,还应不断学习其它方法来优化插件系统。本文只做了关于地震数据处理的几个简单的功能,后面还需添加更多的插件,不断完善地震数据处理软件的功能。
参考文献:
[1]黄维通.Visual C++面向对象与可视化程序设计
65
第1期        姬广忠等:基于VC的插件技术在地震数据处理系统中的应用

本文发布于:2024-09-23 09:19:26,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/618789.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:插件   菜单   地震   处理
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议