基于数据采集卡的动态电阻检测系统毕业论文(编辑修改稿)内容摘要:

被存储在一个USER DLL 中、 Windows 编程所需要的大量的 API 函数也被包含在 Kernel DLL中。 在 Windows 操作系统中使用 DLL 有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个 DLL 文件,真正实现了资源“共享”,大大缩小了应 用程序的执行代码,更加有效的利用了内存;使用DLL 的另一个优点是 DLL 文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的 DLL 文件就可以了,而且,当 DLL 中的函数改变后,只要不是参数的改变 ,程序代码并不需要重新编译。 这在编程时十分有用,大大提高了软件开发和维护的效率。 DLL 是建立在客户 /服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个 DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的 DLL。 DLL 库不同于静态库,在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为 *.LIB) , Visual 基于数据采集卡的动态电压检测系统 8 C++的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。 这个过程称为 静态链接 ,此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。 在动态库的情况下,有两个文件,一个是引入库( .LIB)文件,一个是 DLL文件,引入库文件包含被 DLL 导出的函数的名称和位置, DLL 包含实际的函数和数据,应用 程序使用 LIB 文件链接到所需要使用的 DLL 文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是 DLL 中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。 从上面的说明可以看出, DLL 和 .LIB 文件必须随应用程序一起发行,否则应用程序将会产生错误。 微软的 Visual C++支持三种 DLL,它们分别是 NonMFC Dll(非 MFC 动态库)、 Regular Dll(常规 DLL)、 Extension Dll(扩展 DLL)。 NonMFC DLL指的是不用 MFC 的类库结构,直接用 C 语言写的 DLL,其导出的函数是标准的 C 接口,能被非 MFC 或 MFC 编写的应用程序所调用。 Regular DLL:和下述的 Extension Dlls 一样,是用 MFC 类库编写的,它的一个明显的特点是在源文件里有一个继承 CWinApp 的类(注意:此类 DLL 虽然从 CWinApp 派生,但没有消息循环) ,被导出的函数是 C 函数、 C++类或者 C++成员函数(注意不要把术语 C++类与 MFC 的微软基础 C++类相混淆),调用常规 DLL 的应用程序不必是 MFC 应用程序,只要是能调用类 C 函数的应用程序就可以,它们可以是在 Visual C++、 Dephi、 Visual Basic、 Borland C 等编译环境下利用 DLL 开发应用程序。 常规 DLL 又可细分成静态链接到 MFC 和动态链接到 MFC 上的,这两种常规 DLL 的区别将在下面介绍。 与常规 DLL 相比,使用扩展 DLL 用于导出增强 MFC 基础类的函数或子类,用这种类型的动态链接库,可以用来输出一个从 MFC 所继承下来的类。 扩展 DLL 是使用 MFC 的动态链接版本所创建的,并且它只被用 MFC 类库所编写的应用程序所调用。 例如你已经创建了一个从 MFC 的 CtoolBar 类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个 MFC扩展的 DLL 中。 扩展 DLL 和常规 DLL 不一样,它没有一个从 CWinApp 继承而来的类的对象,所以,开发人员必须在 DLL 中的 DllMain 函数添加初始化代码和结束代码。 对动态链接库,我们还需建立如下概念: 基于数据采集卡的动态电压检测系统 9 ( 1) DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的 DLL 接口规范和调用方式,用各种语言编写的 DLL 都可以相互调用。 譬如 Windows 提供的系统 DLL(其中包括了 Windows 的 API),在任何开发环境中都能被调用,不在乎其是 Visual Basic、 Visual C++还是Delphi。 ( 2)动态链接库随处可见 我们在 Windows 目录下的 system32 文件夹中会看到 、 和 , windows 的大多数 API 都包含在这些 DLL 中。 中的函数主要处理内存管理和进程调度; 中的函数主要控制用户界面; 中的函数则负责 图形方面的操作。 一般的程序员都用过类似 MessageBox 的函数,其实它就包含在 这个动态链接库中。 由此可见 DLL 对我们来说其实并不陌生。 ( 3) VC 动态链接库的分类 Visual C++支持三种 DLL,它们分别是 NonMFC DLL(非 MFC 动态库)、MFC Regular DLL( MFC 规则 DLL)、 MFC Extension DLL( MFC 扩展 DLL)。 非 MFC 动态库不采用 MFC 类库结构,其导出函数为标准的 C 接口,能被非 MFC 或 MFC 编写的应用程序所调用; MFC 规则 DLL 包含一个继承自CWinApp 的类,但其无消息循环; MFC 扩展 DLL 采用 MFC 的动态链接版本创建,它只能被用 MFC 类库所编写的应用程序所调用。 常用的动态链接库安装在 Windows 目录下的、随 Windows 软件包提供的DLL。 这些动态链接库中所包含的函数就称为 Windows API 函数。 API 函数,即 Application Program Interface (应用程序接口 ), 是一系列用C语言编写的函数库,是附带在 Windows系统内部的一个极其重要的组成部分。 Windows的 32位 API是一系列很复杂的函 数、消息的集合,它可以看成 Windows系统为在其下运行的各种开发系统提供的开放式通用功能增强接口,它使编程人员更容易地用不同类型的语言编制出运行在 Windows 系统上的应用程序。 Win32 API 包括了 1000 多个 API 调用,加上 API 附带的几百种 Windows 常量、消息和数据类型结构,是用户用了一系列用于 Windows 编程的复杂而又有效的工具。 调用 DLL 有两种方法 静态调用和动态调用。 (1).静态调用其步骤如下: 把 拷到你目标工程 (需调用 的工程 )的 Debug目录下; 基于数据采集卡的动态电压检测系统 10 把 拷到你目标工程 (需调用 的工程 )目录下; 把 (包含输出函数的定义 )拷到你目标工程 (需调用 的工程 )目录下; 打开目标工程选中工程 ,选择 Visual C++的 Project 主菜单的 Settings 菜单; 执行第 4 步后, VC 将会弹出一个对话框,在对话框的多页显示控件中选择 Link 页。 然后在 Object/library modules 输入框中输入: ; 选择目标工程 Head Files 加入: 文件; 最后 在 目标工程 (*.cpp,需要调用 DLL 中的函数 )中包含你的: include 注: youApp 是 DLL 的工程名。 (2).动态调用其程序如下。 动态调用时只需做静态调用步骤 1。 void MPS() { HINSTANCE hDllInst = LoadLibrary()。 if(hDllInst) { typedef DWORD (WINAPI*MYFUNC)(DWORD,DWORD)。 MYFUNCyouFuntionNameAlias=NULL。 // youFuntionNameAlias 函数别名 youFuntionNameAlias= (MYFUNC)GetProcAddress(hDllInst,youFuntionName)。 // youFuntionName 在 DLL 中声明的函数名 if(youFuntionNameAlias) { youFuntionNameAlias(param1,param2)。 } FreeLibrary(hDllInst)。 } } 显式(静态)调用: LIB + DLL + .H,注意 .H 中 dllexport 改为 dllimport 隐式(动态)调用: 基于数据采集卡的动态电压检测系统 11 DLL + 函数原型声明,先 LoadLibrary,再 GetProcAddress(即找到 DLL中函数的地址),不用后 FreeLibrary。 板卡提供的 DLL 文件中用到的函数 extern C int SetPara(int SampleRate, int ADChannalNumber, int *ADPGAofChannals, int DIOModal, unsigned short PWM1, unsigned short PWM2, int ComparatorEnable, int ExtTrigger,int DeviceNumber) int SetPara 函数执行配置采集卡参数的功能。 若 函数执行成功,返回 1;执行失败返回 0。 int SampleRate:采样率、刷新率等工作时钟频率。 此参数为内部时钟频率设定。 参数取值范围为 500080000,小于 5000 将被设置为 5000,大于 80000将被设置为 80000。 若 ExtTrigger = 0, EX1 和 EX5 对外输出该频率的时钟脉冲;若 ExtTrigger = 1,只有 EX1 输出时钟脉冲。 对于 AD 而言, SampleRate的 值 为 总 采 样 率 值 , 实 际 分 配 到 每 个 通 道 上 的 采 样 率 为SampleRate / (ADChannalNumber / 2)。 对于 DA 和 DIO 而言, SampleRate 就是每个通道的工作频率值。 int ADChannalNumber:模拟输入通道数。 ADChannalNumber = 2, AD1 与AD9 分别被配置为两路模拟信号输入,并且为同步采集,其余 ADx口无效;ADChannalNumber = 4, AD AD AD AD10 被配置为四路模拟信号输入, AD1 与 AD9 同步, AD2 与 AD10 同步,相邻通道为切换扫描模式,其余ADx 口无效; ADChannalNumber = 8, AD AD AD AD AD ADAD1 AD12 被配置为八路模拟信号输入, AD1 与 AD9 同步, AD2 与 AD10同步, AD3 与 AD11 同步, AD4 与 AD12 同步,相邻通道为切换扫描模式,其余 ADx 口无效; ADChannalNumber = 16,所有通道被配置为十六路模拟信号输入, AD1 与 AD9 同步, AD2 与 AD10 同步, AD3 与 AD11 同步, AD4与 AD12 同步, AD5 与 AD13 同步, AD6 与 AD14 同步, AD7 与 AD15 同步,AD8 与 AD16 同步,相邻通道为切换扫描模式。 若给出的 ADChannalNumber参数值小于 4, 则自动配置为 2;若给出的 ADChannalNumber 大于 4 而小于 8,则自动配置为 4;若给出的 ADChannalNumber 大于 8 而小于 16,则自动配置为 8; 若给出的 ADChannalNumber 大于 16,则自动配置为 16。 int * ADPGAofChannals:模拟输入增益设置。 ADPGAofChannals 为一维 16元素数组,数组元素依次代表模拟输入 116 通道的增益系数。 每个元素的取值为: ADPGAofChannals[i] = 1, 无增益; ADPGAofChannals[i] = 2,2 倍增 益;基于数据采集卡的动态电压检测系统 12 ADPGAofChannals[i] = 4, 4 倍增益; ADPGAofChannals[i] = 8, 8 倍增益; ADPGAofChannals[i] = 16, 16 倍增益。 若 ADPGAofChannals[i]为其他值,则自动设置 ADPGAofChannals[i] = 1。 int DIOModal:数字输入 /输出端口模式设置。 DIOModal = 0, D1D8 全部为输入模式; DIOModal = 1, D1D8 全部。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。