模拟实验测试平台的设计与开发论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模拟实验测试平台的设计与开发
摘要
本文实现了模拟实验的虚拟测试平台,为实现模拟器件测试平台的功能,采用VC++可视化编程技术及DLL动态连接库的技术。
具体实现的功能有:加载DLL库、对DLL库内的函数的调用、读取信息、画出器件图、对管脚施加信号、施加连续信号。
其中加载DLL库时采用的是运行是动态加载;对DLL库中函数的调用是采用在基类中设置虚函数接口,再通过该类对象指针调用这类里的虚函数来实现对派生类中的函数的调用的思想来实现。
该平台具有的这些功能能够满足不同器件的测试需要。
文中还简略介绍了虚拟实验平台的现实意义、DLL库技术、VC++可视化编程环境以及编写模拟平台时所遇到的一些难点,其中DLL 动态连接库的加载,DLL库中函数的导出比较难理解,其实现方法在本文也有所介绍。
关键词:虚拟实验平台;DLL动态连接库;VC++可视化编程
The Design and Develop Of Virtual Experimental Testing
Platform
Abstract
This paper presents the simulation of virtual test platform, to achieve the functional of Analog Test Platform, the VC++ visual programming technology and DLL Dynamic Link Library Technology have been used. The concrete realization function includes: Loading the DLL , the right bank of DLL function call , Reading information , painted map devices, imposing signals to the pin, the infliction continuous signal . And Loading DLL is used in the operation of dynamically loaded,DLL library of function calls is used in the base class function to set up virtual interface,then indicators such objects such Lane called the virtual function to achieve the right type of derivative function call to realize the idea. The function of the platform can meet the different needs of the test. The paper also gave a brief description of the significance of the virtual experimental platform, DLL library technology, VC++ Visual Programming Environment and some difficulties in the preparation of a simulation platform, the Loading of DLL Dynamic Link Library and DLL library function derived more difficult to understand, The methods of their realization in this paper has been introduced.
Keywords: Virtual Experimental Platform ; DLL Dynamic Link Library ; VC++ Visual Programming
目录
论文总页数:24 1 引言 (1)
1.1课题背景 (1)
1.2虚拟实验平台 (1)
2 开发工具的选择 (1)
2.1开发工具的确定 (1)
2.2开发环境 (1)
3 需求分析 (2)
3.1DLL简介 (2)
3.2DLL中有些什么内容 (3)
3.2.1DLL 的优点 (3)
3.2.2DLL的依赖项 (4)
3.2.3DLL的不同类型 (5)
3.2.4DLL 的函数调用 (5)
3.2.5DLL相关概念 (6)
3.3项目要求 (7)
3.3.1指定DLL库的加载 (7)
3.3.2DLL库内函数的调用 (7)
3.3.3读取器件信息 (7)
3.3.4施加高低电平信号 (7)
3.3.5信号的连续施加 (7)
3.4项目难点及解决方法 (7)
3.4.1DLL库的加载 (7)
3.4.2DLL库内的函数调用 (7)
4 设计实现 (8)
4.1指定DLL库加载的实现 (8)
4.2DLL库内函数调用的实现 (8)
4.3读取器件信息的实现 (8)
4.4施加单一信号的实现 (9)
4.5信号的连续施加的实现 (9)
5 实现代码及其效果介绍 (9)
5.1程序效果介绍 (9)
5.2主要函数介绍 (9)
5.2.1对DLL库进行装载 (9)
5.2.2读取器件信息 (10)
5.2.3显示器件 (10)
5.2.4对单一管脚施加信号 (11)
5.2.5连续信号施加 (11)
5.2.6鼠标操作 (12)
5.3效果演示 (13)
6 课题改进方向及建议 (14)
结论 (15)
参考文献 (16)
致谢 (17)
声明 (18)
1引言
1.1课题背景
伴随信息技术的发展,以计算机模拟实际实验已经成为一项成熟且倍受欢迎的技术。
它能让实验具备更好的可视性,让信号的传递更加直观,学生操作实验更加简捷,教师指导实验更加方便,节约硬件资源。
无疑它为进行实验带来了更多的便利。
1.2虚拟实验平台
虚拟实验平台是通过软件编程仿真各种电子器件,可以做各种电路实验及设计性实验、基本电路实验、直流电路、交流电路、动态电路、这些功能模块成为虚拟平台与实验者之间的桥梁,共同构成网上虚拟实验室系统,起到帮助学生完成实验任务。
2开发工具的选择
2.1开发工具的确定
VC++自诞生以来,一直是Windows环境下最主要的应用开发系统之一。
VC++不仅是C++语言的集成开发环境,而且与Win32紧密相连,所以,利用VC++开发系统可以完成各种各样的应用程序开发,从底层软件知道上层直接面向用户的软件。
而且,VC++强大的调试功能也为大型复杂软件的开发提供了有效的排错手段。
进入20世纪90年代以来,随着多媒体技术和图形技术的不断发展,可视化技术得到广泛的重视,越来越多的计算机专业人员和非专业人员都开始研究并应用可视化技术,所谓可视化技术,一般是指软件开发阶段的可视化和对计算机图形技术和方法的应用。
VC++是一个很好的可视化编程工具,使用VC++环境来开发程序缩短了开发的时间,而且它的界面更友好,便于程序员操作。
虽然.NET、VB等等现在使用的其它工具也拥有比较方便的操作界面,但是由于题目涉及对DLL的调用,采VC++更加直接方便,所以最终选择了VC++作为开发工具。
2.2开发环境
开发环境是程序员同VC++的交互界面,通过它程序员可以访问C++原代码
编辑器、资源编辑器、使用内部调试器、还可以创建项目文件。
VC++拥有很多好处,首先它可以让程序开发人员更直观的看到程序的结构,然后提供了很多控件,可以很方便的对这些控件进行编码,总的来说它给程序员提供了一个更好的编程环境(如图1所示)。
3 需求分析
3.1 DLL 简介
先来阐述一下DLL(Dynamic Linkable Library )的概念,可以简单的把DLL 看成一种仓库,它提供给用户一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论用户愿不愿意,lib 中的指令都被直接包含在最终生成的EXE 文件中了。
但是若使用DLL ,该DLL 不必被包含在最终EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与EXE 独立的DLL 文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,
而在动态链接库中还可以再包含其他的
动态或静态链接库。
DLL其实就是动态连接库,操作系统的大量功能都是由动态链接库(DLL) 提供的。
另外,当您在Windows操作系统之一上运行某一程序时,该程序的很多功能可能是由DLL 提供的。
例如,某些程序可能包含很多不同的模块,而该程序的每个模块都包含在DLL 中并从中分发。
使用DLL 有助于促进代码的模块化、代码重用、内存的有效使用和减少所占用的磁盘空间。
因此,操作系统和程序能够更快地加载和运行,并且在计算机中占用较少的磁盘空间。
当程序使用DLL 时,一个称为依赖性的问题可能导致该程序无法运行。
当程序使用DLL 时,就会创建一个依赖项。
如果其他程序改写和损坏了该依赖项,原来的那个程序就可能无法成功运行。
在引入Microsoft .NET Framework 之后,大多数依赖性问题都已经通过使用程序集消除了。
3.2DLL中有些什么内容
简介中提到DLL是一个动态连接库,那这库中到底包含些什么呢?其实DLL 是一个包含可由多个程序同时使用的代码和数据的库。
例如,在Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。
因此,每个程序都可以使用该DLL 中包含的功能来实现“打开”对话框。
这有助于促进代码重用和内存的有效使用。
通过使用DLL,程序可以实现模块化,由相对独立的组件组成。
例如,一个计帐程序可以按模块来销售。
可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。
因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。
例如,您可能具有一个工资计算程序,而税率每年都会更改。
当这些更改被隔离到DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。
3.2.1DLL 的优点
3.2.1.1使用较少的资源
当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。
这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在Windows 操作系统上运行的程序。
3.2.1.2推广模块式体系结构
DLL 有助于促进模块式程序的开发。
这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。
模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。
3.2.1.3简化部署和安装
当DLL 中的函数需要更新或修复时,部署和安装DLL 不要求重新建立程序与该DLL 的链接。
此外,如果多个程序使用同一个DLL,那么多个程序都将从该更新或修复中获益。
当您使用定期更新或修复的第三方DLL 时,此问题可能会更频繁地出现。
3.2.2DLL的依赖项
当某个程序或DLL 使用其他DLL 中的DLL 函数时,就会创建依赖项。
因此,该程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。
例如,如果发生下列操作之一,则该程序可能无法运行:
依赖DLL 升级到新版本。
修复了依赖DLL。
依赖DLL 被其早期版本覆盖。
从计算机中删除了依赖DLL。
这些操作通常称为DLL 冲突,当这些情况出先时该程序可能无法成功运行。
为了帮助最大限度地减少依赖性问题而在Microsoft Windows 2000 和较高版本的Windows 操作系统中引入了以下更改:
Windows 文件保护:
在Windows 文件保护中,操作系统禁止未经授权的代理更新或删除系统DLL。
因此,当程序安装操作尝试删除或更新被定义为系统DLL 的DLL 时,Windows 文件保护将寻找有效的数字签名。
专用 DLL:
通过专用DLL 可以使程序避免遭受对共享DLL 进行的更改。
专用DLL 使用版本特定信息或空 .local 文件来强制要求程序所使用的DLL 的版本。
要使用专用DLL,请在程序根文件夹中查找DLL。
然后,对于新程序,请向该DLL 中添加版本特定信息。
对于旧程序,请使用空 .local 文件。
每个方法都告诉操作系统使用位于程序根文件夹中的专用DLL。
3.2.3DLL的不同类型
使用MFC可以生成两种类型的DLL:MFC扩展DLL和常规DLL。
常规DLL有可以分为动态连接和静态连接。
Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。
3.2.3.1MFC扩展DLL
每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。
它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。
也就是它可以导出C++类给客户端。
导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。
同时,在DLL中也可以使用DLL和MFC。
Visual C++使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必须要动态连接到MFC代码库的DLL。
(这里谈到的两个DLL,一个是用户自己编写的DLL,一个装MFC类库的DLL)现在MFC 代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC 代码DLL。
所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。
而这个DLL必须在客户程序运行的计算机上。
3.2.3.2常规DLL
使用MFC扩展DLL的一个问题就是DLL仅能和MFC客户程序一起工作,如果需要一个使用更广泛的DLL,最好采用常规DLL,因为它不受MFC的某些限制。
常规DLL也有缺点:它不能和客户程序发送指针或MFC派生类和对象的引用。
一句话就是常规DLL和客户程序的接口不能使用MFC,但在DLL和客户程序的内部还是可以使用MFC。
当在常规DLL的内部使用MFC代码库的DLL时,可以是动态连接/静态连接。
如果是动态连接,也就是常规DLL需要的MFC代码没有构建到DLL中,这种情况有点和扩展DLL类似,在DLL运行的计算机上必须要MFC代码库的DLL。
如果是静态连接,常规DLL里面已经包含了需要的MFC代码,这样DLL的体积将比较大,但它可以在没有MFC代码库DLL的计算机上正常运行。
3.2.4DLL 的函数调用
当您在应用程序中加载 DLL 时,可以使用两种链接方法来调用导出的 DLL 函数。
这两种链接方法是加载时动态链接和运行时动态链接。
加载时动态链接:
在加载时动态链接中,应用程序像调用本地函数一样对导出的 DLL 函数进行显式调用。
要使用加载时动态链接,请在编译和链接应用程序时提供头文件(.h) 和导入库文件 (.lib)。
当您这样做时,链接器将向系统提供加载 DLL 所需的信息,并在加载时解析导出的 DLL 函数的位置。
运行时动态链接:
在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx 函数以在运行时加载 DLL。
成功加载 DLL 后,可以使用GetProcAddress 函数获得要调用的导出的 DLL 函数的地址。
在使用运行时动态链接时,无需使用导入库文件。
下面说明了有关何时使用加载时动态链接以及何时使用运行时动态链接的应用程序条件:
启动性能:
如果应用程序的初始启动性能很重要,则应使用运行时动态链接。
易用性:
在加载时动态链接中,导出的 DLL 函数类似于本地函数。
这使您可以方便地调用这些函数
应用程序逻辑:
在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。
在开发多语言版本时,这一点很重要。
3.2.5DLL相关概念
对动态链接库,还需建立如下概念:
DLL 的编制与具体的编程语言及编译器无关
只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
动态链接库随处可见
在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。
kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll 中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。
由此可见DLL其实并不陌生。
3.3项目要求
3.3.1指定DLL库的加载
目前流行将函数封装为DLL函数库,便于更新及管理。
目前所要完成的测试平台也要求能够加载已经编写好的各个器件类DLL,以便对其进行测试,检验其功能是否正常。
所以需要能够对指定的DLL库进行加载。
3.3.2DLL库内函数的调用
既然涉及到DLL库,那么自然需要对其中的函数进行调用,本课题要求能够不对DLL库中的函数进行定义而直接对其调用。
3.3.3读取器件信息
平台要求能够读取器件的管脚、编号等等信息,以便画出器件示意图。
3.3.4施加高低电平信号
在以前同学完成的项目中已经提供了施加信号的函数,该函数封装在各器件类的DLL库中,只需要对其进行调用即可完成信号的施加,不过本课题还需要信号的连续施加功能。
3.3.5信号的连续施加
很多时候只是提供单一的信号并不能满足器件的需求,手动输入信号过与缓慢不便于观察,器件大多数时候需要一串连续的信号输入以便观察器件的输出。
所以本程序需要信号的连续输入功能。
以保证测试需要。
3.4项目难点及解决方法
3.4.1DLL库的加载
由于DLL是一个比较新的技术,对于DLL的接触也比较少,所以在理解和使用上也相对比较困难。
通过查阅资料大致了解了DLL的概念,对DLL库的装载也有了一定的基础了解。
在这里装载DLL库使用了一个API中的函数:HMODULE hMod = LoadLibrary();用它可以对指定的DLL库进行加载,所以该函数要求提供具体的需要装载的DLL库的名称。
使用该函数后hMod则等价与指定装载的DLL库。
3.4.2DLL库内的函数调用
在完成DLL库加载后,接下来就需要调用库中的函数,调用DLL库中的函
数与一般的函数调用有很大差异,一般来说函数的调用需要先对该函数进行声明然后才可以对它进行调用,否则系统将无法识别该函数。
但对DLL中的函数调用不是通过声明的方式来完成,多数情况下它使用了一个DLL库中的导出函数,pComp = pfnEF((LPVOID )pDoc)该函数的作用是生成一个库中类的对象,再将该对象的地址返回给一个该类的指针,然后就可以通过这指针来调用库中的函数,它的好处是不用再在程序中给出函数的实现以及声明就可以直接地函数进行调用。
4设计实现
4.1指定DLL库加载的实现
实现对DLL函数库的加载的具体方法是用HMODULE hMod = LoadLibrary(m_LibName+"Dll.dll");函数对指定的DLL库进行加载。
该函数括号中的m_LibName+"Dll.dll"是需要加载的DLL库的名称。
4.2DLL库内函数调用的实现
在完成对指定的器件DLL库的加载后,再用该DLL中的pComp = pfnEF((LPVOID )pDoc)导出函数返回了一个基类指针值pComp,由于在基类中各函数被设置为了虚函数,这样就可以在测试平台中不对需要调用的器件DLL 中的函数进行声明,而直接以这个指针来调用基类的派生类(也就是各种器件类)封装的DLL中的函数,于是实现了DLL库内函数的调用。
4.3读取器件信息的实现
首先在这先介绍一下器件信息的储存方式,对于器件的信息是采用TXT文档的方式保存的,先将器件的信息按照特定的格式编写再将它储存在TXT文档中,这样一来当系统需要器件信息的时候只需要对该TXT文档进行读操作,再做一定的处理就可以了。
这就是器件信息的保存思路。
所以要实现该功能就需要对指定的文档进行读取,于是在这设计了一个文档内容的读取函数ReadInfo(fp,pDoc),这函数可以将指定的.TXT文本文档中的器件信息进行读取,该函数的使用需要先给定fp一个地址值,这由函数fp = fopen(m_CompMsg,"rt")来完成,其中的参数m_CompMsg 是一个字符串它就是需要加载的器件的TXT文档的名字。
这样就可以对一个指定的器件的信息进行读取。
4.4施加单一信号的实现
以下是完成施加单一信号的核心函数pComp->OutSig(m_Pin,m_SigVal),该函数中m_pin参数是管脚的编号,m_SigVal是施加的信号,两个参数的具体值需要测试人员手动提供。
4.5信号的连续施加的实现
实现连续信号输入的思路和器件读取的思路错别不大,都是先信号流以特定的格式保存在一个TXT文档中,再对该文档进行读取,在TXT文档中一行保存一个管脚编号以及它所对应的信号值,每次TXT文档读完一行便调用一次pComp->OutSig(m_Pin,m_SigVal)函数进行一次设置,所以在这使用了一个定时器SetTimer(100,500,NULL)函数,在定时器内打开了一个TXT文档,在这文档中提取出了2个整形参数(管脚编号与信号值)再将它赋给相对应的管脚后,再读取下一行。
在读完整个文档后结束。
5实现代码及其效果介绍
5.1程序效果介绍
该平台它能够对各同学编写完成的虚拟器件进行测试,首先要做的是将编写好的器件封装成的DLL库以及存放器件信息的TXT文件的名字告诉平台,然后平台就可以对其进行装载,并且将器件显示在器件图中,之后就可以开始对器件进行简单的测试。
5.2主要函数介绍
5.2.1对DLL库进行装载
下面一段代码实现了对DLL函数库的加载以及对DLL库里的函数调用,具体方法是用HMODULE hMod = LoadLibrary(m_LibName+"Dll.dll");对指定的DLL库进行了加载,然后再以pComp = pfnEF((LPVOID )pDoc)导出函数返回了一个指针值,然后就可以以这个指针来调用其中的函数。
void CTestComponentDlg::OnBtnLoad()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
HMODULE hMod = LoadLibrary(m_LibName+"Dll.dll");
typedef DComponent* (*PExportedFn)(LPVOID );
PExported
FnpfnEF=(PExportedFn)GetProcAddress(hMod,"Create"+m_LibName);
pComp = pfnEF((LPVOID )pDoc);
// int ver = pComp->GetVersion();
UpdateData(FALSE);
}
5.2.2读取器件信息
下面这段代码可以将指定的.TXT文本文档中的器件信息进行读取,其中包括器件位置(画图时开始的位置)、管脚信息等相关信息。
它首先是打开了一个文档,该文档的开始地址给了FP这个指针然后用自己编写的一个函数pComp->ReadInfo(fp,pDoc)对该文档的内容进行了读取。
void CTestComponentDlg::OnBtnReadinfo()
{
// TODO: Add your control notification handler code here
FILE *fp ;
UpdateData(TRUE);
fp = fopen(m_CompMsg,"rt");
pComp->ReadInfo(fp,pDoc);
fclose(fp);
UpdateData(FALSE);
}
5.2.3显示器件
这段代码完成的是画出器件图的功能,它根据读取器件代码所读取到的信息来完成器件图的显示。
void CTestComponentDlg::OnBtnDisp()
{
// TODO: Add your control notification handler code here
CDC *pdc = c_Field.GetDC();
// int ver = pComp->GetVersion();
// char *pName = pComp->GetMyName() ;
pComp->DrawObject(pdc);
c_Field.ReleaseDC(pdc);
}
5.2.4对单一管脚施加信号
这是对单一管脚的信号施加代码段m_Pin是管脚编号,SigVal是信号值。
void CTestComponentDlg::OnBtnaddsig()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
pComp->OutSig(m_Pin,m_SigVal); //m_Pin是管脚编SigVal是信号UpdateData(FALSE);
}
5.2.5连续信号施加
在这里由于要施加连续信号,所以使用了一个定时器SetTimer(100,500,NULL)函数,在定时器内打开了一个TXT文档,在这文档中提取出了2个整形参数(管脚编号与信号值)再将它赋给相对应的管脚。
在读完文档后释放了fp指针。
void CTestComponentDlg::OnButton1()
{
// TODO: Add your control notification handler code here
SetTimer(100,500,NULL);
fp = fopen("cmd.txt","r");
}
void CTestComponentDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
char buf[250];
if(fp != NULL)
{
int pin,s;
fgets(buf,250,fp);
sscanf(buf,"%d,%d",&pin,&s);
pComp->OutSig(pin,s);
// c_ListMsg.AddString(buf);
if(feof(fp))
{
fclose(fp);
fp = NULL ;
}
}
CDialog::OnTimer(nIDEvent);
}
5.2.6鼠标操作
这是一段操作鼠标的代码,它留出了很多接口函数由编写器件时程序员自己对它进行实现。
当在器件编码中完成对这些接口的实现后,在本程序中就可以在显示出的器件图上通过鼠标点击来触发一些事件,比如开关开启等。
本程序在测试8255器件时并没有使用到该功能。
#include "line.h"
class CVisualexDoc;
class DComponent
{
public:
CLine *Pin; //保存引脚信息
char **pPinName;
int iPinNum ;
CString sComName ;
CPoint Position; //位置信息
int cx;
int cy; //器件的大小
protected:
CVisualexDoc *pParent ;
public:
DComponent(CVisualexDoc *p,int );
virtual ~DComponent();
virtual int OutSig(int iPinNo,int iSigVal)=0;
virtual char * GetMyName() {return "null";};
virtual int GetVersion(){return 1;};
virtual int DrawObject(CDC* pDC);//{return 1;};
virtual int ReadInfo(FILE* file,CVisualexDoc* pDoc);
// 查找一个引脚
virtual int FindPin(CVisualexDoc* pDoc,CPoint point,int ele);
virtual CLine* FindPin(int iPinNo,int iSigVal);
virtual int MouseEvent(int event , CPoint pt) {return 1 ;};
};
5.3效果演示
图2是装载指定DLL以及读取器件信息的示意图,在图中可以看出要装载指定的DLL就需要给出该DLL的名称,读取指定器件也要给出保存该器件信息的TXT文档名称。
对于图2补充说明一点:其中装载的器件DLL库的名称,为了简化输入,由于虚拟实验台器件DLL遵守了统一的命名规范,所以,这里采用简称输入,不需要完整的器件DLL文件名。
能对DLL文件进行合法性检测,测试是否是符合规范的虚拟实验台器件DLL。
图3演示了载入器件DLL后,调用器件DLL的显示器件信息函数后,显示器件内部结构的效果图。
图 3 器件显示示意图
6课题改进方向及建议
现在的测试平台并不完整,有些功能还不完善。
例如信号的连续施加功能,现在虽然能够将信号连续施加,但是在某个管脚上应当有输入或者输出信号的时候不能够明显的提示,以至于不能很好的判断该管脚上是否有信号,测试时候不怎么方便。
可以适当加入提示信息方便观察。
在这由于时间仓促,未能实现实属遗憾。
结论
本文成功地实现了用于模拟实验平台器件DLL功能测试的简单平台。
本测试平台现在实现的功能包括:载入模拟器件DLL,检验DLL合法性,查找器件DLL中的导出函数,提供对器件各个管脚设置高低输入信号,显示器件的输出信息,显示器件内部结构,根据器件需要,可以向器件发送定时和鼠标操作事件。
通过本测试平台,能对用于虚拟实验台的仿真DLL器件进行基本的功能检测,确认仿真实现的正确性。
在现有测试平台中,还有一个功能没有实现,就是测试平台对器件DLL提供连续信号测试。
这是今后修改完善中要解决的重要问题。
参考文献
[1]谭浩强 C程序设计(第二版)[M] 北京:清华大学出版社 1999
[2]黄维通Visual C++ 面向对象与可视化程序设计[M] 北京:清华大学出版社 2003
[3]王国印等译 Visual C++ 技术内幕(第四版)[M] 北京:清华大学出版社 1999
[4]王华等 Visual C++编程实例与技巧[M] 北京:机械工业出版社 1999
[5]孙鑫 VC++从入门到精通开发详解[M] 北京:电子工业出版社 2006
[6]郑莉 C++语言程序设计[M] 北京:清华大学出版社 2004
[7]王华等 Visual C++编程实例与技巧[M] 北京:机械工业出版社 1999
[8]胡哲源 MFC程序设计与剖析[M] 北京:清华大学出版社 2002。