您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页实验4_Bci协议解析实战

实验4_Bci协议解析实战

来源:意榕旅游网
深圳大学实验报告

课程名称:生物医学工程应用实验

实验项目名称:Bci协议解析实战

学院:医学部生物医学工程学院专业:生物医学工程

指导教师:

报告人:学号:

班级:2017级生物医学工03班

实验时间:20190515实验报告提交时间:20190529

教务部制

实验目的:

学习以C语言和C++两种方式对BCI协议进行解析,并掌握制作及使用动态链接库的基本方法

实验任务:

1、在动态链接库工程中,用C语言和C++两种方式对BCI协议进行解析,导出库

2、在测试工程中,调入库,测试解析数据是否正确

实验过程及结果:一、C语言方式

工程一、建立BciData库1、“文件”→“新建”,选择“Win32Dynamic-LinkLibrary”,输入工程名,点击确定

2、选择“一个空的DLL工程”,点击“完成”,弹出一个新的窗口,点击“确定”

3、将已写完的Bci协议的解析复制进BciDll文件夹中,点击工具栏中的

将文件导入

4、在“BciPack.h”和“BciData.h”文件中,在函数的声明前面加上_declspec(dllexport)[若文件中已有则无需再添加]

5、BciData.c中的代码为:

6、BciPack.c中的代码为:

7、编译、链接,在BciDll文件的Debug文件中,会生成BciDll.dll文件和BciDll.lib文件

工程二、BciDll库的测试1、建立一个工程:“新建”→“文件”→“工程”→“Win32ConsoleApplication”2、将BciPack.h、BciData.h、BciDll.lib和BciData.dll文件复制到BciTest文件夹中,点击

将BciData.h、BciPack.h添加到工程中

3、新建BciTest.cpp文件

4、在BciTest.cpp文件中添加如下代码:

5、编译、链接后执行,会得到解析后的各个参数的数据,如图:

二、C++方式

(一)编辑动态链接库1、创建动态链接库

2、创建类

3、在类下编辑代码

4、编辑UnpackBci.c文件

(二)测试1、创建工程

2、导入动态链接库BciDll.lib、BciDll.dll、UnPackBci.h三个文件

3、新建“test.cpp”文件、添加代码

4、更改数组a[]的大小和数值,检查数据是否解析正确深圳大学学生实验报告用纸

结果分析与讨论

1、遇到问题及解决方法

本次实验的操作相对简单,且为设计太多界面设计方面的问题,所以在实验过程中没有遇到太多问题,但通过本次实验,我仍然学到很多知识,虽然实验中的.dll文件都是老师帮忙写好并封装过的,但是我还是很想知道这个文件的构成是怎样的,经过了解,学习到了DLL的基础知识,希望能够用到以后的学习中去。

(1)动态链接库(DLL):Windows操作系统的基础。WindowsAPI中的所有函数都包含在DLL中

(2)3个最重要的DLL分别是:Kernel32.dll,包含用于管理内存、进程和线程的各个函数;User32.dll,包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,包含用于画图和显示文本的各个函数(3)Windows还配有若干别的DLL,它们提供了用于执行一些特殊任务的函数。如AdvAPI32.dll包含用于实现对象安全性、注册表操作和事件记录的函数,ComDlg32.dll包含常用的对话框,ComCtl32.dll则支持常用窗口控件(4)DLL是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数,函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数

(5)DLL还有助于共享数据资源,多个应用程序可同时访问内存中单个DLL副本的内容

(6)尽管DLL和应用程序都是可执行文件的程序模块,但它们之间有若干不同之处,对于最终用户来说,最明显的差异在于DLL不是可直接执行的程序,从系统角度讲,应用程序和DLL之间有以下两个基本差异

1应用程序可有多个同时在系统上运行的实例,而DLL只能有一个实例

2应用程序可以拥有堆栈、共用内存、文件句柄、消息队列这样的事务,而DLL不能

2、知识点和心得体会

经过进一步的了解,我又学习到了更多DLL相关知识

(1)知识点:

1动态链接和静态链接:动态链接是相对静态链接来说的。在程序开发过程中,产生一个Windows可执行文件需要链接不同的目标模块(.obj)、运行时库(.lib)文件以及编译过的资源(.res)文件,此时的链接称为静态链接;与静态链接相对应,动态链接发生在程序运行时,动态链接允许执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息,在静态连接中,链接器从静态链接库获取所有被引用的函数,并将库和代码一起放在可执行函数文件中

2DLL与进程的地址空间:在应用程序(或另一个DLL)能够调用DLL中的函数之前,必须找到DLL文件中的函数,即DLL文件必须被映射到调用进程的地址空间中;有两种方式可以实现这一点,即加载时的隐含链接或运行时的显示链接,一旦DLL被映射到调用进程的地址空间中,DLL的代码和数据看上去就像是在进程的地址空间中的额外代码和数据一样,DLL中函数代码创建的任何对象均由调用线程所拥有,而DLL本身并不拥有任何东西

3显式链接与隐式链接:链接DLL到可执行的两种方法。隐式链接时,使用DLL的可执行程序需要链接DLL导入库(.lib文件),可执行程序需要获取以下内容:包含导出函数(或导出类)声明的头文件、导入库(.lib文件)、实际的DLL(.dll文件),从编程的角度看,调用导出函数与调用其他函数完全一样,若要生成调用可执行文件,必须与导入库链接。如果使用的是外部生成文件,须指定导入库的文件名,此导入库中列出了要链接到的其他对象(.obj)文件或库,操作系统在加载调用可执行文件时,必须能够定位DLL文件;显式链接时,使用DLL的可执行程序在运行时通过函数调用来显示加载或卸载DLL,并通过函数指针来调用DLL的导出函数

4DLL的搜索路径及extern“C”修饰符:如果显示链接DLL,那么可以指定DLL的路径,如果不指定路径或用隐式链接,那么Windows将使用下列搜索顺序来寻找DLL,即包含EXE文件的目录、进程的当前目录、Windows系统目录、环境变量列出的目录,需要注意的是,因为有这么多搜索路径,所以要注意DLL版本的一致性,否则容易发生运行老版本DLL的错误。通常来说,C++编译器会改变函数和变量的名字,而加上extern“C”修饰符就可以告诉编译器不要改变变量名或函数名,这样,编写的DLL中输出的变量和函数就可以供使用C、C++或任何其他编程语言编写的可执行模块来访问。(2)心得体会

通过本次实验,我学习了bci协议解析的方法,同时了解了动态链接库的基础知识,让我意识到界面设计包含的范围之广,只有不断的学习新的理论知识,并不断的实操练习,才能真正掌握界面设计所需的知识。

指导教师批阅意见:

成绩评定:

指导教师签字:年月日

备注:

注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。

2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务