动态链接库教程(中文版)
动态链接库教程
动态链接库教程动态链接库(Dynamic Link Library,简称DLL)是一种可由多个程序共享的库文件,它包含了一组函数和数据,可以在程序运行时加载和调用。
DLL 文件可用于将一些通用的功能封装成函数,供多个程序调用,从而提高代码的复用性和开发效率。
本文将详细介绍动态链接库的概念、使用方法以及制作过程。
一、动态链接库的概念动态链接库是一种包含了函数和数据的库文件,它可以在程序运行时被加载和调用。
与静态链接库相比,动态链接库的优势在于节省内存空间和提高代码的复用性。
当多个程序需要使用同一个功能时,它们可以共享同一个DLL文件,避免了重复编写相同的代码。
二、动态链接库的使用方法在使用动态链接库之前,我们首先需要了解动态链接库的编译、加载和调用过程。
1.编译动态链接库在创建 DLL 文件时,我们需要按照一定的规范编写代码,并将其编译成 DLL 文件。
编译时,需要指定导出函数的修饰符(如 _stdcall、_cdecl等),以及导出函数的声明。
这些步骤可以在开发环境(如Visual Studio)中完成。
2.加载动态链接库在程序运行时,需要加载 DLL 文件。
我们可以通过调用LoadLibrary 函数来加载 DLL,该函数返回一个句柄,表示 DLL 的实例。
加载 DLL 文件后,我们可以通过该句柄获取 DLL 中导出函数的地址。
3.调用动态链接库在获取到DLL中导出函数的地址后,我们可以通过函数指针来调用DLL中的函数。
通过函数指针,程序可以跳转到DLL中执行指定的函数,从而完成相应的功能。
三、制作动态链接库下面以C++语言为例,简单介绍如何制作一个动态链接库。
1.创建DLL工程在 Visual Studio 中创建一个 DLL 项目,选择 DLL(动态链接库)作为项目类型。
在项目中添加需要导出的函数,并在头文件中进行声明。
2.编写导出函数在 DLL 项目中编写需要导出的函数,并在函数前添加修饰符(如_stdcall、_cdecl等)。
动态链接库的使用方法
动态链接库的使用方法动态链接库(Dynamic Link Library,DLL)是Windows系统中一种常见的文件类型,用于存储可被程序在运行时动态加载的函数和数据。
它可以提供代码和资源的共享,使得程序的安装包更小,节省了系统资源。
使用动态链接库有以下几个优点:1.模块化:将程序代码和资源划分为独立的模块,便于开发和维护。
2.共享性:多个程序可以共享同一个动态链接库,减少重复的代码和数据的存储。
3.动态加载:可以在程序运行时动态地加载和卸载动态链接库,提高了程序的灵活性和可扩展性。
1.创建动态链接库:使用C/C++编程语言可以创建动态链接库。
首先,在开发环境中创建新的DLL项目,并选择动态链接库的类型。
在项目中添加需要的代码和资源,并编写相应的函数和数据接口。
将这些接口封装在一个头文件中,并在源文件中实现具体的功能。
最后,编译项目生成动态链接库文件(.dll 文件)。
2.导出函数和数据:在动态链接库中,明确指定哪些函数和数据需要被其他程序调用。
在函数和数据的声明前加上__declspec(dllexport)关键字即可。
例如:```C++__declspec(dllexport) int Add(int a, int b);```3.调用动态链接库:在其他程序中调用动态链接库中的函数和数据,需要先导入相应的函数和数据。
使用C/C++编程语言可以创建一个头文件,其中包含要导入的函数和数据的声明。
例如:```C++__declspec(dllimport) int Add(int a, int b);__declspec(dllimport) extern double PI;```然后,在使用这些函数和数据的源文件中包含这个头文件即可。
4.加载和卸载动态链接库:在程序运行时,需要动态地加载动态链接库,并在使用完之后卸载。
可以使用LoadLibrary函数来加载动态链接库,使用FreeLibrary函数来卸载动态链接库。
动态链接库的使用
动态链接库的使用一、编写合格的动态链接库头文件C语言的头文件,可供一个或多个程序引用,里面一般定义程序所需的常量,自定义类型及函数原型说明等.其中的函数原型说明,则供编译器检查语法,用于排除引用参数时类型不一致的错误.只有编写合格的动态链接库头文件,程序员才能正确使用动态链接库内的函数.动态链接库头文件要采用C语言标准格式,其中的动态函数原型定义,不必象上文介绍的那样用(*动态函数名)的描述形式.请看下面的例子:(每行开始的数字为所在行行号,为笔者添加,供注解使用)1 /* adatetime.h : 纵横软件制作中心雨亦奇(zhsoft@)编写, 2002-03-06. */23 #ifndef __DATETIME_H45 #define __DATETIME_H67 /* 日期结构 */8 typedef struct9 {10 int year;11 int mon;12 int day;13 }DATETYPE;1415 /* 时间结构 */16 typedef struct17 {18 char hour;19 char min;20 char sec;21 }TIMETYPE;2223 int getdate(DATETYPE *d); /* 取当前日期 */24 int gettime(TIMETYPE *t); /* 取当前时间 */2526 #endif注:与上文的datetime.h文件比较,从该头文件第23,24行可以看到,动态函数getdate,gettime的原型定义改变了,不再使用(*getdate),(*gettime)的格式了(这种格式使用较为罗嗦).二、正确编译与命名动态链接库为了让GCC编译器生成动态链接库,编译时须加选项-shared.(这点须牢记)LINUX系统中,为了让动态链接库能被系统中其它程序共享,其名字应符合“lib*.so*”这种格式.如果某个动态链接库不符合此格式,则LINUX的动态链接库自动装入程序(ld.so)将搜索不到此链接库,其它程序也无法共享之.格式中,第一个*通常表示为简写的库名,第二个*通常表示为该库的版本号.如:在我的系统中,基本C动态链接库的名字为libc.so.6,线程pthread动态链接库的名字为libpthread.so.0等等.本文例子所生成的动态链接库的名字为libmy.so,虽没有版本号,但也符合所要求的格式.生成该动态链接库的维护文件makefile-lib内容如下:1 # makefile : 纵横软件制作中心雨亦奇编写, 2002-03-07.23 all : libmy.so45 SRC = getdate.c gettime.c67 TGT = $(SRC:.c=.o)89 $(SRC) : adatetime.h10 @touch $@1112 %.o : %.c13 cc -c $?1415 # 动态链接库(libmy.so)生成16 libmy.so : $(TGT)17 cc -s -shared -o $@ $(TGT)18运行命令:$ make -f makefile-lib$即生成libmy.so库.注: 维护文件中,第17行用-shared选项以生成动态链接库,用-s选项以去掉目标文件中的符号表,从而减小文件长度.三、共享动态链接库3.1 动态链接库配置文件为了让动态链接库为系统所使用,需要维护动态链接库的配置文件 /etc/ld.so.conf 。
Win32教程17-动态链接库
link /DLL /SUBSYSTEM:WINDOWS /DEF:DLLSkeleton.def /LIBPATH:c:\masm32\lib DLLSkeleton.obj
编译器的开关选项是一样的,即:/c /coff /Cp。在您链接好后,链接器会生成.lib 和.dll文件。前者是引入库,当其它的程序要调用您的动态链接库中的函数时就需要该引入库,以便把必要的信息加入到其可执行文件中去。
在WINDOWS中,由于有多个程序同时运行,如果您的程序非常大的话,那将消耗相当多的内存。WINDOWS的解决办法是:使用动态链接库。动态链接库从表面上看也是一大堆的通用函数,不过即使有多个程序调用了它,在内存中也仅仅只有动态链接库的唯一一份拷贝。WINDOWS是通过分页机制来作到这一点的。当然,库的代码只有一份,但是每一个应用程序要有自己单独的数据段,要么就会乱掉。
TestHelloAddr dd ? ; TestHello 函数的地址
.code
start:
invoke LoadLibrary,addr LibName
;--------------------------------------------------------
理论:
如果您编程的时间非常长,就会发现很多的程序之间其实有相当多的重复代码。每编一个程序就重写一遍这些代码既没必要又浪费时间。在DOS时代,一般的做法是把这些重复的代码写成一个个的函数,然后把它们按类别放到不同的库文件中去。当要使用这些函数时,只要把您的目标文件(.obj)文件和先前存放在库文件中的函数进行链接,链接时链接器会从库文件中抽取相关的信息并把它们插入到可执行文件中去。这个过程叫做静态链接。C运行时库就是一个好例子。这样的库的缺点是您在每一个调用库函数的程序中都必须嵌入同一函数的拷贝,这显然很浪费磁盘。在DOS时代毕竟每一时刻仅有一个程序在运行,所以浪费的还只是磁盘而已,在多任务的WINDOWS时代就不仅浪费磁盘,还要浪费宝贵的内存了。
第13章 动态链接库
第15页,共31页。
第13章 动态链接库
MFC中的DLLa、Non-MFC DLL:指的是不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一 般用的是标准C接口,并能被非MFC的应用程序所调用。
第16页,共31页。
第13章 动态链接库
VC6支持自动生成的Win32 DLL和MFC AppWizard DLL,其中自动生成的Win32 DLL共包括三种DLL 工程。从菜单项,选择对话框中的Projects选项卡,图13.1
承类的对象指针。Extension DLL使用MFC的动态连接版本所创建的,并且它只被用MFC类库所编写的应用程 序所调用。
第20页,共31页。
第13章 动态链接库
第21页,共31页。
第13章 动态链接库
系统运行一个调用DLL的程序时,将在以下位置查找
该DLL: 1.包含EXE文件的目录 2.进程的当前工作目录
束进程或者线程,不会调用DLLMain。
第7页,共31页。
第13章 动态链接库
MFC AppWizard 生成的Regular DLL在后面的章节会有介绍,这里只讨论它的入/出口点问题。 每个Regular DLL都有MFC AppWizard 自动生成的CWinApp派生类的对象,与其它MFC应用程序一
DLL或API函数,Declare语句是Windows所必需的,这一点很重要。并且在32位版的VB中动态链接库中的函数
对条件是很敏感的。
第23页,共31页。
第13章 动态链接库
DLL的调试有很多中方法,但都需要把DLL工程生成的后缀名为.dll的文件放在执行它的应用程序可以
找到的目录中。这可以有很多中方法,手工也行的。
动态链接库教程(中文版)
什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是Dynamic Link Library 的缩写形式,动态链接库 (DLL) 是作为共享函数库的可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个 DLL 副本的内容。
本文比较了Visual C++所支持的三种动态链接库,列出了各自不同的特点和应用场合,详细地描述了三种动态链接库的建立和调用的方法。
关键字:动态链接库;导出函数;调用引言较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。
在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序的EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试;而且,一些模块的功能可能较为通用,在构造其它软件系统时仍会被使用。
Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的动态链接库(Dynamic Linkable Library,DLL)文件,并可对它们单独编译和测试。
在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。
这种方式不仅减少了EXE 文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。
动态链接库概述动态链接库技术是Windows最重要的实现技术之一,Windows的许多新功能、新特性都是通过DLL来实现的。
动态链接库
4.2 DLL的基本理论 应用程序在使用DLL中的内容之前,系统要调用入出口 函数完成DLL的初始化和终止工作。 4.2.1 DLL入出口函数 1、DllMain函数:在一个DLL的调用和撤除时被调用,一 般发生在应用程序使用LoadLibrary 和FreeLibrary等函数 及进程经线程启动和终止时。函数结构为:
4.2.4 从DLL中导出数据变量 (1)使用DEF文件,设置关键字CONSTANT导出.通过 用CONSTANT标志时,表明前面导出的不是函数,而 是一个数据变量. EXPORTS Bvariable @4 CONSTANT Extern BOOL bVariable ;//程序中的应用 (2)可以在应用程序中使用关键字 _declspec(dllimport) 引入对DLL导出的变量的作用,在DLL源程序中以 _declspec(dllexport)来说明要导出的变量.
4.2.2 DLL的链接方式 DLL中包含一个或多个函数,调用这些函数的过程和 编译,链接的过程是独立的.有两种链接方式:隐式 链接和显式链接.
1. 隐式链接DLL 原理:先说明DLL的导入库文件(lib),因在库文件中包 含了一系列指向动态链接库的指针.应用程序通过 库文件和DLL链接,调用DLL中的函数. 应用程序在调用DLL时需以下信息: A. 包含导出函数以及类声明的头文件,需要知道函数 名和函数接口信息. B. DLL的导入库文件,应用程序在编译链接需要. C. 实际的DLL文件,应用程序在运行时调用它.
4.3.2 用VC++的MFC生成的 DLL 1. MFC类库的DLL自动生成过程: FILE->NEW->PROJECT->MFC AppWizard(dll) > ok,然后选择相应的类型工程. 2. MFC AppWizard DLL类型: (1)静态链接MFC的 Regular DLL 在内部使用MFC的DLL库,可被MFC和非MFC的应用 程序使用,若在工程建立时使用的是MFC静态库, 导出函数使用标准C语言接口,创建时自动生成 DEF文件,如导出函数:MyExportFunction()用: extern “c” EXPORT MyExportFunction(); (2)动态链接MFC 的Regular DLL
动态链接库的创建与使用
动态链接库的创建与使用动态链接库(Dynamic Link Library,DLL)是一种用于在Windows 操作系统中组织、存储和分发可执行代码和数据的文件格式。
DLL文件包含一组函数、变量和资源,可以与其他程序共享,以便提高应用程序的开发效率和运行速度。
1.创建DLL项目:首先,在开发环境中创建一个DLL项目。
可以使用开发工具如Visual Studio等来创建。
选择DLL项目后,在项目中添加需要的函数、变量和资源。
2.导出函数和变量:在DLL项目中,需要明确指定哪些函数和变量可以被外部程序调用。
可以通过将函数和变量声明为`__declspec(dllexport)`来实现。
这样,外部程序在调用时可以访问到这些函数和变量。
示例代码如下:```cpp__declspec(dllexport) int add(int a, int b)return a + b;}```3.编译DLL项目:在完成函数和变量的导出后,编译DLL项目生成DLL文件。
编译过程会把函数和变量编译成二进制代码,并生成DLL文件。
4.调用DLL:在外部程序中调用DLL中的函数和变量时,首先需要加载DLL文件,并获取对应的函数或变量的地址。
然后,可以使用加载的函数或变量来执行相应的操作。
示例代码如下:```cpp#include <windows.h>#include <iostream>using namespace std;typedef int (*AddFunc)(int, int);int mainHMODULE dllHandle = LoadLibrary("mydll.dll");if (dllHandle == NULL)cout << "Failed to load DLL." << endl;return 1;}AddFunc addFunc = (AddFunc)GetProcAddress(dllHandle, "add");if (addFunc == NULL)cout << "Failed to get address of function." << endl;FreeLibrary(dllHandle);return 1;}int result = addFunc(1, 2);cout << "Result: " << result << endl;FreeLibrary(dllHandle);return 0;}```在上述代码中,通过`LoadLibrary`函数加载DLL文件,并使用`GetProcAddress`函数获取函数地址,在调用函数时可以直接使用获取到的函数地址来执行相应的操作。
第16章 动态链接库(DLL)
16.1.4 DllMain()函数
当dll文件被调用或被操作系统(Windows操作系 统调用dll是非常常见的运行方式)加载时,将会 调用_DllMainCRTStartup()函数,该函数调用全 局对象的构造函数,然后调用全局函数DllMain()。 DllMain()函数与C/C++的main()函数不同的是, DllMain()不仅仅在dll被客户程序进程连接时调 用,而且在断开客户进程也会被调用。 DllMain()函数与类的构造函数具有相似的地方, 就是当开发者不定义DllMain()函数时,系统将自 动生成一个不做任何事情的DllMain()函数。
16.4.2 添加功能代码
添加功能代码分为以下几个步骤: (1)添加绘制控件的类。为项目添加两个文件 “rygwnd.cpp”文件和“rygwnd.h”文件。 (2)编写窗口结构注册函数。 (3)设置映射函数。 (4)为CMyControlDLLApp类添加初始化的虚函数。
16.4.3 创建客户程序测试自定义控件
16.4 实例16.1-创建和使用自定义控件DLL 本节将讲解自定义的控件DLL,该控件是一个可以 接收鼠标左键单击消息的彩灯,通过鼠标单击来 改变彩灯的颜色。本节的学习重点是控件的消息 传递到父窗口的过程和原理。 本项目比较简单,主要分为3个步骤: (1)创建项目。 (2)给项目添加功能代码。 (3)创建客户程序,用于测试自定义控件。
16.1 DLL理论基础
DLL文件(Dynamic Linkable Library 即动态链接库文件), 是一种可执行文件,它允许与程序共享执行特殊任务所必 需的代码和其他资源。 比较大的应用程序都由很多模块(多个功能)组成,这些 模块分别完成相对独立的功能,它们彼此协作来完成整个 软件系统的工作。可能存在一些模块的功能较为通用,在 构造其它软件系统时仍会被使用。在构造软件系统时,如 果将所有模块的源代码都静态编译到整个应用程序 EXE 文 件中,会产生一些问题:一个缺点是增加了应用程序的大 小,它会占用更多的磁盘空间,程序运行时也会消耗较大 的内存空间,造成系统资源的浪费;另一个缺点是,在编 写大的EXE程序时,在每次修改重建时都必须调整编译所有 源代码,增加了编译过程的复杂性,也不利于阶段性的单 元测试。
dll(动态链接库)的创建和使用
dll的创建和使用使用C++语言创建dll并使用该dll的演示、说明Dll的创建和使用第一部分创建C风格的dll (4)步骤1:创建dll工程 (4)步骤2:文件改名 (5)步骤3:拷贝文件内容 (6)步骤4:从工程中删掉文件main.cpp,main.h (7)步骤5:继续修改文件mydll.h和mydll.cpp (7)步骤6:编译并生成dll文件 (8)第二部分以间接调用的方式使用.dll (10)步骤1:新建一个控制台工程(UseDll.cbp). (10)步骤2:修改main.cpp。
(11)步骤3:编译,生成UseDll.exe (12)步骤4:拷贝mydll.dll到UseDll.exe所在目录 (13)步骤5:执行UseDll.exe,输出: (13)间接调用Dll的好处 (14)第三部分以直接调用的方式使用.dll (15)步骤1:改写main.cpp (15)步骤2:添加mydll.dll的静态导出库到UseDll工程中 (16)步骤3:编译并执行,输出 (17)直接调用的好处 (18)Dll的优势 (18)调用约定的说明 (18)第四部分创建C++风格的dll(本地方法) (19)步骤1:在mydll.h中新增导出的类 (19)步骤2:在mydll.cpp中实现Cat类 (19)步骤3:编译MyDll,生成mydll.dll,mydll.a (21)第五部分使用本地风格的C++ DLL (22)步骤1:修改UseDll中的main.cpp (22)步骤2:将mydll.a添加到UseDll工程的BuildOptions中 (23)步骤3:编译UseDll工程,生成UseDll.exe (23)步骤4:将MyDll.dll拷贝到UseDll.exe目录下 (23)步骤5:执行UseDll.exe,输出 (23)本地风格的不足 (24)第六部分创建推荐风格的C++ DLL (26)步骤1:修改mydll.h,创建Cat的接口类ICat (26)步骤2:新建类Cat (27)步骤3:实现createCat函数 (29)步骤4:编译,生成mydll.dll (31)第七部分使用推荐风格的C++ DLL (32)步骤1:修改UseDll中的main.cpp (32)步骤2:将第六部分生成的libmydll.a添加到UseDll的BuildOptions中 (33)步骤3:编译UseDll工程,生成useDll.exe (34)步骤4:将第六部分生成的mydll.dll拷贝到UseDll.exe所在文件目录 (34)步骤5:执行,输出 (35)推荐风格的好处: (35)第一部分创建C风格的dll下面以CodeBlocks为例演示说明创建和使用dll,其它开发环境类似步骤1:创建dll工程创建dll工程MyDll.cpp步骤2:文件改名新建两个文件mydll.h和mydll.cpp步骤3:拷贝文件内容将main.h中的核心内容拷贝到mydll.h中再将main.cpp中的部分内容拷贝到mydll.cpp中,并更改include文件名。
第20章使用动态链接库和API
20.2 理解DLL调用规范
• 调用DLL略显复杂。幸而,DLL有很好的说明文档, 并且在Visual Basic中提供了有关说明。为了在 用户应用程序中使用DLL,应在代码中调用相应函 数之前加以声明。
• 程序需要告诉Visual Basic如何调用DLL,即需要 声明过程及其定义的参数。完成上述步骤后,用 户程序便可实际的调用函数。“函数声明”可以 使Visual Basic编译器知道如何传递数据到函数 (或从函数输出)。Windows API是功能强大且实 用的函数集合,但它也非常脆弱。传递参数的类 型错误便可能引起程序阻塞、停止,甚至使整个 系统崩溃,这常常造成很大危害,特别是没有存 盘的时候。
20.3 API查看器
• 在了解了关于DLL的声明基础后,现在再介绍一个 快捷方法。Visual Basic带有一个称为API浏览器 的实用程序,
20.4 在应用程序中使用API函数
• 前面,介绍了API的一些基础知识。下面将用几个 实例说明,在Visual Basic中使用 判断窗体是否已经显示
• (具体内容请参照本书)
20.4.2 获取鼠标在屏幕上的位置
• (具体内容请参照本书)
20.4.3 最前窗体(顶层窗体)
• (具体内容请参照本书)
20.1 动态链接库(DLL)简介
• 使用Visual Basic编写应用程序时,偶尔会遇到 仅使用Visual Basic的控件没办法解决,或者解 决起来很费劲的问题。此时可以有三种选择:
• 利用其他程序设计语言(例如C++语言)编写代码, 再从 Visual Basic中调用此类程序。
• 可通过OLE技术调用另一个应用程序。 • 可以调用Windows操作系统内置的Windows API函
Trnsys中文教程-第一册
Trnsys中⽂教程-第⼀册TRNSYS 18 A TraN sient Sy stem S imulation program第1卷Volume 1⼊门Getting Started⽬录。
TABLE OF CONTENTS1.开始1–5。
1. GETTING STARTED 1–51.1.本⼿册是什么?1—5。
1.1. What is this manual? 1–51.2.什么是trnsys?1—5。
1.2. What is TRNSYS? 1–51.3.Trnsys是如何⼯作的?1—5。
1.3. How does TRNSYS work? 1–51.4.组件模型如何⼯作?1—6。
1.4. How do the component models work? 1–61.5.trnsys包中有哪些不同的程序?1—6。
1.5. What are the various programs in the TRNSYS package? 1–61.6.如何将组件模型添加到trnsys?1—8。
1.6. How are component models added to TRNSYS? 1–81.7.TRNSYS⽂档集中包括哪些不同的⼿册?1—8。
1.7. What are the different manuals included in the TRNSYS documentation set? 1–81.⼊门。
GETTING STARTED1.1. 这本⼿册是什么? What is this manual?《⼊门⼿册》的⽬的是解释trnsys如何⼯作以及组成trnsys包的不同⼯具背后的⼀些基本概念。
⼀旦你对这些基本概念有了了解,你就可以移动到⽂档集的其他卷上,这些⽂档集提供了关于使⽤TrnSyS的不同⼯具和教程的详细信息。
但在继续学习教程之前,理解本⼿册中包含的概念⾮常重要。
The intent of the Getting Started manual is to explain some of the basics concepts behind how TRNSYS works and the different tools that make up the TRNSYS package. Once you have an understanding of these basic concepts you can move to the other volumes of the documentation set that provide detailed information on the different tools and tutorials on the use of TRNSYS. But it is very important to understand the concepts included in this manual before proceeding with tutorials.1.2. 什么是trnsys? What is TRNSYS?trnsys是⼀个完整的、可扩展的系统暂态仿真环境,包括多区域建筑。
Pyparsing中文教程
parseString 应用语法到给定的输入文本(从定义上看,如果这个文本可以应用多次规则也只会运用到第一次上)
scanString 这是个生成器函数,给定文本和上界下界,其会试图返回所有解析结果
searchString scanString的简单风光,返回你给定文本的全部解析结果,放在一个列表中。
典型的pyparsing程序具有以下结构:
import pyparsing模块
使用pyparsing类和帮助方法定义语法
使用语法解析输入文本
处理从解析出的文本
从Pyparsing出引用名字
通常,使用from pyparsing import *是不被python风格专家鼓励的。因为它污染了本地变量命名空间,因其从不明确的模块中引入的不知道数量的名字。无论如何,在pyparsing开发工作中,很难想象pyparsing定义的名字会被使用,而且这样写简化了早期的语法开发。在语法最终完成后,你可以回到传统风格的引用,或from你需要的那些名字。
-------
Pyparsing 导引
by Pau McGuire
你需要从文本文件或网页中提取数据吗?或者你想要更人性化的用户命令接口或者搜索字符串?正则表达式和lex/yacc让你的眼睛和脑袋疼?
Pyparsing将成为解决方案。Pyparsing是纯python的类库,其能让你容易的建立递归下降(recursive-descent)解析器。这不需要你自己写个解析器。只要使用pyparsinng,你能够解析HTML,轻松建立日志文档数据提取器,复杂数据结构以及命令解释器。这个Short Cut将告诉你怎么做!
解析不十分严格格式的数据形式的任务经常出现在开发者面前。有时其是一次性的,像内部使用的API升级程序。其他时候,解析程序作为在命令行驱动的程序中的内建函数。
动态链接库(dll)和静态库的创建及使用教程
动态链接库和静态库的创建及使用教程第一部分静态库(以vs2005为例)一、创建新的静态库项目1.从“文件”菜单中,选择“新建”,然后选择“项目…”。
2.从“项目类型”窗格中,选择“Visual C++”下的“Win32”。
3.从“模板”窗格中,选择“Win32 控制台应用程序”。
4.为项目选择一个名称,如“MathFuncsLib”,并将其输入“名称”字段。
为解决方案选择一个名称,如“StaticLibrary”,并将其输入“解决方案名称”字段。
5.按“确定”启动Win32 应用程序向导。
在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”。
6.从“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“静态库”。
7.从“Win32 应用程序向导”的“应用程序设置”页中,取消选择“附加选项”下的“预编译头”。
8.按“完成”创建项目。
向静态库添加类1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。
将显示“添加新项”对话框。
从“类别”窗格中,选择“Visual C++”下的“代码”。
从“模板”窗格中选择“头文件(.h)”。
为头文件选择一个名称,如“MathFuncsLib.h”,并按“添加”。
将显示一个空白文件。
2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。
代码应与以下内容类似:// MathFuncsLib.hnamespace MathFuncs{class MyMathFuncs{public:// Returns a + bstatic double Add(double a, double b);// Returns a - bstatic double Subtract(double a, double b);// Returns a * bstatic double Multiply(double a, double b);// Returns a / b// Throws DivideByZeroException if b is 0static double Divide(double a, double b);};}3.若要为新类创建源文件,请从“项目”菜单中选择“添加新项…”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是Dynamic Link Library 的缩写形式,动态链接库 (DLL) 是作为共享函数库的可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个 DLL 副本的内容。
本文比较了Visual C++所支持的三种动态链接库,列出了各自不同的特点和应用场合,详细地描述了三种动态链接库的建立和调用的方法。
关键字:动态链接库;导出函数;调用引言较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。
在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序的EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试;而且,一些模块的功能可能较为通用,在构造其它软件系统时仍会被使用。
Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的动态链接库(Dynamic Linkable Library,DLL)文件,并可对它们单独编译和测试。
在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。
这种方式不仅减少了EXE 文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。
动态链接库概述动态链接库技术是Windows最重要的实现技术之一,Windows的许多新功能、新特性都是通过DLL来实现的。
其实,Windows本身就是由许多DLL组成的,它最基本的三大组成模块Kernel、GDI和User都是DLL。
一般来说,DLL是一种磁盘文件,以.dll、.DRV、.FON、.SYS和许多以.EXE 为扩展名的系统文件都可以是DLL。
它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。
如果与其它DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。
DLL模块中包含各种导出函数,用于向外界提供服务,Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。
DLL可以有自己的数据段,但没有自己的堆栈,DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的,使用与调用它的应用程序相同的堆栈模式;一个DLL在内存中只有一个实例;DLL实现了代码封装性;DLL的编制与具体的编程语言及编译器无关。
动态链接库的分类微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。
1、Non-MFC DLL(非MFC动态库)这种动态链接库指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。
如果建立的DLL 不需要使用MFC,那么应该建立Non-MFC DLL,因为使用MFC会增大用户库的大小,从而浪费用户的磁盘和内存空间。
2、Regular DLL(常规DLL)这种动态链接库和下述的Extension Dll一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C++、Delphi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。
常规DLL又可细分成静态链接到MFC和动态链接到MFC两种:(1)静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。
该类DLL 里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。
输出函数有如下形式:extern "C" EXPORT YourExportedFunction( );如果没有extern "C"修饰,输出函数仅仅能从C++代码中调用。
(2)动态链接到MFC的常规DLL里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。
所有从DLL输出的函数应该以如下语句开始:AFX_MANAGE_STATE(AfxGetStaticModuleState( ))此语句用来正确地切换MFC模块状态。
3、Extension Dll(扩展DLL)这种动态链接库是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。
例如你已经创建了一个从MFC的CtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。
扩展DLL 和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。
与常规DLL相比,扩展的DLL有如下不同点:1) 它没有一个从CWinApp派生的对象;2) 它必须有一个DLLMain函数;3) DLLMain调用AfxInitExtensionModule函数,必须检查该函数的返回值,如果返回0,DLLMmain也返回0;4) 如果它希望输出CRuntimeClass类型的对象或者资源(Resources),则需要提供一个初始化函数来创建一个CDynLinkLibrary对象。
并且,有必要把初始化函数输出;5) 使用扩展DLL的MFC应用程序必须有一个从CWinApp派生的类,而且,一般在InitInstance里调用扩展DLL的初始化函数。
动态连接库的建立1、Non-MFC DLL的建立每一个DLL必须有一个入口点,就象用C编写的应用程序时,必须有一个WINMAIN函数一样。
在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。
如果应用程序的DLL需要分配额外的内存或资源,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain()函数按照下面的格式书写。
BOOL APIENTRY DllMain(HANDLE hModule,DWORDul_reason_for_call,LPVOID lpReserved){switch( ul_reason_for_call ){case DLL_PROCESS_ATTACH:.......case DLL_THREAD_ATTACH:.......case DLL_THREAD_DETACH:.......case DLL_PROCESS_DETACH:.......}return TRUE;}参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:(1)DLL_PROCESS_ATTACH: 进程被调用或调用Load Library,DLL被链接到当前进程的地址空间并被初始化;(2)DLL_THREAD_ATTACH: 当前进程创建一个新线程,DLL在新线程正文内被调用;(3)DLL_PROCESS_DETACH: 调用DLL的进程被终止,DLL被卸载;(4)DLL_THREAD_DETACH: 调用DLL的线程被终止,DLL被卸载;lpReserved为保留参数。
如果在DLL中加入想要输出的函数、变量、C++类或其它函数,可以调用VC 的关键字_declspec(dllexport)。
2、MFC AppWizard[dll]方式下Regular DLL和Extension DLL的建立在MFC AppWizard[dll]下生成的DLL文件有三种方式:静态链接到MFC的常规DLL、动态链接到MFC的常规DLL以及MFC扩展DLL,在创建DLL是,要根据实际情况选择创建DLL的方式。
静态链接到MFC的常规DLL和静态连接到MFC常规DLL的区别是:前者使用的是MFC的静态链接库,生成的DLL文件长度大,一般不使用这种方式;后者使用MFC的动态链接库,生成的DLL文件长度小;动态链接到MFC的常规DLL所有输出的函数应该以如下语句开始:AFX_MANAGE_STATE(AfxGetStaticModuleState( )) //此语句用来正确地切换MFC模块状态MFC扩展DLL的特点是用来建立MFC的派生类,Dll只被用MFC类库所编写的应用程序所调用。
Extension DLLs 和Regular DLLs不一样,它没有一个从CWinApp继承而来的类的对象,编译器默认了一个DLL入口函数DLLMain()作为对DLL的初始化,你可以在此函数中实现初始化,代码如下:BOOL WINAPI APIENTRY DLLMain(HINSTANCE hinstDll,DWORD reason ,LPVOID flmpload){switch(reason){……………//初始化代码;}return true;}参数hinstDll存放DLL的句柄,参数reason指明调用函数的原因,lpReserved 是一个被系统所保留的参数。
对于隐式链接是一个非零值,对于显式链接值是零。
动态连接库的调用动态链接库的调用可以分为两种:一种是隐式调用,一种是显示调用。
1、隐式的调用这种调用方式需要把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,在使用DLL中的函数时,只须说明一下后就可以直接通过函数名调用DLL 的输出 饔梅椒ê统绦蚰诓科渌 暮 且谎 摹R 降饔貌恍枰 饔肔oad Library()和Free Library()。
程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。