Windows Dll编程

合集下载

dll 原理

dll 原理

dll 原理DLL(Dynamic-Link Library)是一种Windows操作系统中常用的动态链接库。

它是一种可执行模块,包含可供程序调用的函数和数据,可以被多个应用程序共享。

在程序运行时,程序可以动态地载入和卸载DLL,从而实现模块化编程的方式。

本文将介绍DLL的原理和相关内容。

一、DLL的作用1. 动态链接:DLL的一个主要作用就是实现动态链接。

动态链接是指在程序运行期间,将DLL中的代码载入内存并链接,再去调用DLL中的函数和数据,以实现程序功能。

与静态链接方式相比,动态链接具有更好的灵活性,可以使程序的运行速度更快,占用内存更少。

2. 模块化编程:通过使用DLL,程序员可以将程序的功能划分为多个模块,从而实现模块化编程,提高代码的可重用性和可维护性。

在不同的应用程序中,可以共享同一模块的代码和数据,避免代码冗余。

3. 插件机制:另一个重要的作用是实现插件机制。

通过使用DLL,程序员可以设计并开发插件,将其作为动态链接库,供其他程序使用。

这使得程序有了更好的扩展性和可配置性。

二、DLL的实现原理1. 建立与卸载:程序载入DLL时,需要在内存中建立一个DLL实例,为DLL分配一块内存,并将DLL的函数地址表加载到内存中。

程序使用DLL的函数时,会根据函数地址表进行调用。

当程序不再需要使用DLL时,可以卸载DLL,释放内存空间。

2. 导出函数表:为了使DLL中的函数能够被其他程序调用,需要在DLL中建立一个导出函数表,记录DLL中所包含的全部函数。

三、DLL的使用方法1. 导出函数:为了使其他应用程序能够调用DLL中的函数,需要在DLL中声明函数为导出函数。

在VC++中,可以使用__declspec(dllexport)关键字来声明函数为导出函数。

2. 导入函数:在同一工程中使用DLL的函数时,需要相应地导入DLL中的函数。

在VC++中,可以使用__declspec(dllimport)关键字来声明函数为导入函数。

Windows的DLL文件原理与修改方法

Windows的DLL文件原理与修改方法

Windows的DLL文件原理与修改方法一、DLL文件常识DLL是Dynamic Link Library的缩写,意为动态链接库。

在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。

当我们执行某一个程序时,相应的DLL文件就会被调用。

一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。

DLL文件一般被存放在C:WindowsSystem目录下二、修改DLL文件的具体应用在系统的组策略和注册表中,我们可以修改一些键值来优化我们的系统,并加强操作系统的安全性。

可是,对于限制下载、禁止删除文件等功能,我们无法通过上述的操作来完成,这只有通过修改系统DLL文件来实现。

目前,我们通过修改系统的DLL文件,可以实现禁止删除文件、禁止IE下载、禁止IE另存为、禁止文件打开方式等功能。

三、系统中部分DLL文件的功能1、Browselc.dll IE所需要调用的库文件DLL结构雏形就是它了2、Shdoclc.dll 系统窗口及设置等,如删除文件、重命名3、Shell32.dll 系统窗口及设置等,如删除文件、重命名4、Cryptui.dll IE控件下载及提示对话框程序四、修改DLL文件的方法1、下载DLL文件修改工具EXESCOPE6.0-6.3或6.4工具2、获取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll这几个链接文件。

在找这几个文件时,最好将其他机器的硬盘,挂接在本机中,然后用本机的操作系统启动并复制这几个文件。

3、在修改DLL文件的时候,打开该键值,在右面的对话框中将所要修改的键值禁用即可,不要删除,以备日后恢复。

五、DLL文件修改秘籍1、禁止下载的修改方法:打开Shdoclc.dll修改资源--对话框---4416,将4416键值禁用即可。

如何编写dll文件

如何编写dll文件
生成一个Dll工程,然后将你的类和函数都添加进去,然后将要输出的函数在该工程下的Translate.def文件中将名字列出(注意,只要名字,不要括号、参数等);实际上和你的Exe工程没有很大的区别。
如果你要用VB用,在Dll中定义你的函数的时候前面要加上“__stdcall”关键字,否则VB没有办法使用。
——(1)Windows的系统目录:\windows\system;
——(2)DOS中path所指出的任何目录;
——(3)程序所在的目录;
一.动态链接库(DLL)结构
——DLL中定义有两种函数:导出函数(export function)和内部函数
(internal function),导出函数可以被其他模块调用,内部函数只能在DLL内部使用。我们在用C++定制DLL文件时,需要编写的就是包含导出函数表的模块 定义文件(.DEF)和实现导出函数功能的C++文件。下面以Sample.dll为例介绍DEF文件和实现文件的结构:
MFC扩展DLL一般用来提供派生于MFC的可重用的类,以扩展已有的MFC类库的功能。MFC扩展DLL使用MFC的动态链接版本。只有使用MFC动态 链接的可执行程序(无论是EXE还是DLL)才能访问MFC扩展DLL。MFC扩展DLL的另一个有用的功能是它可以在应用程序和它所加载的MFC扩展 DLL之间传递MFC和MFC派生对象的指针。在其它情况下,这样做是可能导致问题的。
非MFC DLL
静态链接到MFC的常规DLL
动态链接到MFC的常规DLL
MFC扩展DLL
其中非MFC DLL(non-MFC DLL)内部不使用MFC,调用非MFC DLL提供的导出函数的可执行程序可以使用MFC,也可以不使用MFC。一般来说,非MFC DLL的导出函数都使用标准的C接口(standard C interface)。

dll文件编写

dll文件编写

.dll文件编写悬赏分:0 |解决时间:2006-5-20 14:56 |提问者:lzpyake最佳答案DLL是一种特殊的可执行文件。

说它特殊主要是因为一般它都不能直接运行,需要宿主程序比如*.EXE程序或其他DLL的动态调用才能够使用。

简单的说,在通常情况下DLL是经过编译的函数和过程的集合。

使用DLL技术主要有以下几个原因:一、减小可执行文件大小。

DLL技术的产生有很大一部分原因是为了减小可执行文件的大小。

当操作系统进入Windows时代后,其大小已经达到几十兆乃至几百兆。

试想如果还是使用DOS 时代的单执行文件体系的话一个可执行文件的大小可能将达到数十兆,这是大家都不能接受的。

解决的方法就是采用动态链接技术将一个大的可执行文件分割成许多小的可执行程序。

二、实现资源共享。

这里指的资源共享包括很多方面,最多的是内存共享、代码共享等等。

早期的程序员经常碰到这样的事情,在不同的编程任务中编写同样的代码。

这种方法显然浪费了很多时间,为了解决这个问题人们编写了各种各样的库。

但由于编程语言和环境的不同这些库一般都不能通用,而且用户在运行程序时还需要这些库才行,极不方便。

DLL的出现就像制定了一个标准一样,使这些库有了统一的规范。

这样一来,用不同编程语言的程序员可以方便的使用用别的编程语言编写的DLL。

另外,DLL还有一个突出的特点就是在内存中只装载一次,这一点可以节省有限的内存,而且可以同时为多个进程服务。

三、便于维护和升级。

细心的朋友可能发现有一些DLL文件是有版本说明的。

(查看DLL文件的属性可以看到,但不是每一个DLL文件都有)这是为了便于维护和升级。

举个例子吧,早期的Win95中有一个BUG那就是在闰年不能正确显示2月29日这一天。

后来,Microsoft发布了一个补丁程序纠正了这个BUG。

值得一提的是,我们并没有重装Win95,而是用新版本的DLL代替了旧版本的DLL。

(具体是哪一个DLL文件笔者一时想不起来了。

Windows下C语言调用dll动态链接库

Windows下C语言调用dll动态链接库

Windows下C语⾔调⽤dll动态链接库dll是windows下的动态链接库⽂件,下⾯记录⼀下在windows下如何调⽤C语⾔开发的dll动态链接库。

1.dll动态链接库的源代码hello_dll.c#include "stdio.h"_declspec(dllexport) void test_print(char const *str){printf("%s\n", str);}_declspec(dllexport) int test_add(int a, int b){return a + b;}上⾯的代码定义了两个函数,第⼀个函数需要传⼊⼀个字符串,然后打印出这个字符串,第⼆个函数需要转⼊两个int型整数,然后返回这两个整数的和。

执⾏ cl -LD hello_dll.c 会⽣成hello_dll.dll⽂件2.main函数的源代码test_hello_dll.c#include <stdlib.h>#include <windows.h>int main(int argc, char const *argv[]){// define two functional pointervoid(*p_test_print)(char const *) = NULL;int(*p_test_add)(int, int) = NULL;int add_result;// load dll file, require window.h fileHMODULE module = LoadLibraryA("hello_dll.dll");if (module == NULL) {system("error load");}p_test_print = (void(*)(char const *))GetProcAddress(module, "test_print");p_test_add = (int(*)(int, int))GetProcAddress(module, "test_add");if (p_test_print != NULL) {p_test_print("Hello This is from dll");} else {system("function p_test_print can not excute");}if (p_test_add != NULL) {add_result = p_test_add(5, 5);printf("Add result is %d\n", add_result);} else {system("function p_test_print can not excute");}FreeLibrary(module);system("pause");return0;}执⾏ cl test_hello_dll.c 会⽣成test_hello_dll.exe的可执⾏⽂件。

枚举dll所有方法

枚举dll所有方法

枚举dll所有方法DLL(Dynamic Link Library)是指包含可被程序运行时加载的代码、数据和资源的文件,它可以被多个程序共享使用。

在Windows中,大量的系统功能和第三方软件的功能都是通过DLL来提供的。

每个DLL 文件中都包含了许多方法(也称为函数),这些方法可以被其他程序调用以完成特定的功能。

我们需要知道如何枚举一个DLL文件中的所有方法。

在Windows平台上,我们可以使用一些编程语言(如C++)的开发工具来完成这个任务。

具体的步骤如下:1.打开DLL文件:首先,我们需要打开目标DLL文件。

可以使用开发工具提供的函数或类来加载DLL文件,并将其映射到内存中。

2.获取函数地址:在DLL文件中,每个方法都有一个唯一的地址。

我们可以使用GetProcAddress函数(在Windows API库中)来获取指定方法的地址。

需要传入DLL文件的句柄和方法名作为参数。

3.遍历所有方法:通过不断调用GetProcAddress函数,并传入不同的方法名,我们可以获取DLL文件中的所有方法的地址。

当我们获取到方法地址后,就可以根据具体的需求,使用这些方法来实现我们的功能。

下面是一些常用的方法,它们被包含在不同的DLL文件中:1. kernel32.dll:这是Windows内核的一部分,提供了许多系统功能的实现。

它包含了很多重要的方法,如CreateFile、ReadFile、WriteFile等,用于文件和设备的操作;还有GetCurrentThread、Sleep、GetTickCount等,用于线程和时间的操作。

2. user32.dll:这是用户界面的一部分,提供了一些用于操作窗口、菜单和消息处理的方法,如CreateWindow、DestroyWindow、GetDlgItem等。

3. gdi32.dll:这是图形设备接口的一部分,提供了一些用于绘制图形的方法,如CreateDC、CreateCompatibleDC、BitBlt等。

dll依赖其他dll

dll依赖其他dll

dll依赖其他dllDLL是动态链接库的缩写,是一种Windows操作系统中常见的文件格式。

在编程中,DLL文件承载着程序的一部分功能,可以被其他程序调用和共享,同时也可以依赖其他的DLL文件。

下面将详细介绍DLL文件的依赖关系,并按照列表形式划分,以便更清晰地理解。

一、DLL文件的依赖关系在Windows操作系统中,DLL文件之间可以存在依赖关系。

依赖关系分为显示依赖和隐式依赖,下面分别进行说明。

1. 显示依赖显示依赖是通过调用LoadLibrary函数或者LoadLibraryEx函数来实现的,具体的依赖关系由程序员在编程过程中设定。

当程序运行时,系统会根据程序中的依赖关系加载所需的DLL文件。

举例来说,若一个程序需要使用某个DLL文件中的函数或者数据,那么程序员可以在代码中使用LoadLibrary函数或者LoadLibraryEx函数来加载该DLL文件。

程序在运行时,会根据这些代码进行依赖关系的加载,使得程序能够正常运行。

2. 隐式依赖隐式依赖是指某个DLL文件在编译时被链接到程序中,而不需要显式地调用LoadLibrary函数或者LoadLibraryEx函数。

在编程过程中,可以直接使用#include指令来引用某个DLL文件中的函数或者数据,并将其链接到程序中。

当程序编译时,链接器会自动将所引用的DLL文件链接到程序中,这就是隐式依赖。

这样,程序在运行时不需要再调用LoadLibrary函数或者LoadLibraryEx函数来加载DLL文件。

二、按照列表划分的DLL文件依赖关系根据DLL文件之间的依赖关系,可以将DLL文件按照列表划分,方便了解不同DLL文件之间的关系。

1. Kernel32.dll- User32.dll- Gdi32.dll- Advapi32.dll- Shell32.dll- Oledlg.dll- Oleaut32.dll2. User32.dll- Gdi32.dll3. Gdi32.dll- Kernel32.dll- User32.dll4. Advapi32.dll- Kernel32.dll5. Shell32.dll- Kernel32.dll6. Oledlg.dll- Kernel32.dll7. Oleaut32.dll- Kernel32.dll以上是一些常见的DLL文件的依赖关系,不同的DLL文件之间可以相互依赖。

windows动态库编译流程

windows动态库编译流程

windows动态库编译流程Windows动态库编译流程是将源代码转化为可执行的动态链接库(DLL)的过程。

以下是关于Windows动态库编译流程的参考内容(不包含链接)。

1. Windows动态库的编译流程通常由以下几个步骤组成:(1)预处理:预处理器会根据预编译指令处理源代码文件,例如#include指令可以将其他头文件的内容插入到当前文件中,宏定义可以在编译过程中替换为相应的内容等等。

(2)编译:编译器将预处理后的源代码文件编译成特定机器平台的目标文件,通常是一种中间代码形式,也就是目标文件(.obj)。

(3)链接:连接器将目标文件、库文件以及其他依赖项进行链接,生成最终的可执行文件或动态链接库。

连接器会解析目标文件之间的调用关系,并将函数、变量的引用解析为实际的地址。

2. 在Windows平台上,常用的编译器是微软的Visual Studio编译器。

在使用Visual Studio进行动态库编译时,可以按照以下步骤进行设置和操作:(1)新建项目:打开Visual Studio,选择“文件”→“新建”→“项目”,选择合适的项目类型(如C++库或通用Windows动态链接库等)。

根据需要进行项目的设置。

(2)编写源代码:在项目中添加源代码文件,编写动态库的实现代码。

(3)设置编译选项:右键点击项目,选择“属性”,在属性窗口中设置编译选项,如C/C++编译器的预处理器定义、头文件搜索路径、编译器警告等级、调试信息生成等。

(4)编译项目:按下F7键或选择菜单项“生成”→“生成解决方案”对项目进行编译。

编译成功后,将生成目标文件(.obj)。

(5)链接库文件:如果需要使用其他库文件,可以将这些库文件添加到项目中,并在属性窗口的链接器选项中指定库文件的路径。

(6)生成动态库:按下Ctrl+Shift+B或选择菜单项“生成”→“生成解决方案”对项目进行生成。

生成成功后,将得到最终的动态链接库文件(.dll)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Windows DLL 编程
一、静态链接库
1.创建一个“Win32 控制台应用程序”项目。

项目名定义为staticdll。

2. 在“应用程序设置”中配置为“静态库”,其他默认。

3.向生成的项目中添加一个头文件和一个实现文件,名称分别为staticlib.h和staticlib.cpp。

4.编译链接后会在解决方案的根目录下的debug目录中得到一个staticdll.lib库文件。

该文件就是静态库的关键文件。

使用该库文件,将其编译链接到用户程序中,就可以调用在静态库中定义的导出函数add。

5.测试静态库staticdll.lib。

1)创建一个“win32控制台应用程序”项目。

名称为:staticdlltest。

2)配置“应用程序设置”为“控制台应用程序”,其他默认。

二、Win32 动态链接库
1.创建一个“Win32 控制台应用程序”。

名称为NonMfcDll。

2.配置“应用程序设置”为“DLL”。

3.向生成的项目中添加一个头文件和一个实现文件,名称分别为nonmfclib.h和
4.为了验证类的导出情况,我们再向本项目中添加一个C++类。

名称为CmyClass。

下面是
该类的头文件及实现文件的具体代码。

CmyClass类中包含了一个成员函数Hello。

不过在用户函数中无法直接调用该函数,必须使用另外一个类外部函数进行间接调用类成员函数。

因此,添加了一个ext_hello 函数用来间接调用一个CmyClass类的对象实例的Hello函数,来达到对类的成员函数的导出使用。

5.编译链接后会在解决方案的根目录下的debug目录中得到一个nonmfcdll.lib库文件和
nonmfcdll.dll动态链接文件。

Lib库文件用来进行静态导入,而dll用来动态导入。

不过请注意这里的lib文件和静态库的lib文件是不一样的。

这里的lib文件只包含了导出函数的接口说明,而真正的导出函数的执行体实际在dll文件中。

6.动态导入win32动态链接库。

1)创建一个“Win32控制台应用程序”项目。

名称为NonMfcDlltest。

2)配置“应用程序设置”为“控制台程序”,其他默认。

3
由上述代码可以总结动态链接库的动态导入的基本步骤大致如下:
●定义一个需要导入的动态链接库导出函数的函数指针类型;
●使用LoadLibrary函数动态加载动态链接库;
●使用GetProcAddress函数获取动态链接库导出函数地址;
●使用函数;
●使用FreeLibrary函数释放动态链接库;
4)采用动态导入方式,只能通过间接使用类外部函数来调用类的成员。

不能直接在用户程序中直接使用类的对象来调用成员。

7.静态导入Win32动态链接库
1)创建一个“Win32控制台应用程序”项目。

名称为NonMfcDllStaticCall。

2)配置“应用程序设置”为“控制台程序”,其他默认。

这里需要注意的是,必须将动态链接库中定义的类的头文件拷贝到测试项目的根目录下,并且在项目主CPP文件中将该头文件包含。

然后,使用#pragma comment指示编译器静态链接动态链接库到项目中,并将需要导入的函数接口在主CPP文件中进行声明。

三、MFC 常规动态链接库
1.创建一个“MFC DLL”项目。

名称为StaticMfcRegularDll。

2. 配置“应用程序设置”为“带静态链接MFC的规则DLL”。

3. 在MFC 规则DLL中导出函数,导出类的方法与前面介绍的Win32 DLL中的方法完全一致,因此,在此就不再进行说明。

4. MFC DLL最大的特点就是可以使用MFC类库。

因此,我们为项目添加一个ID为IDD_DIALOG1的对话框资源,然后为该对话框添加一个派生于CDialog的类:CDllDlg。

对话框资源,你可以根据你的需求定义。

我们这里就进行最简单的布置为如下图的形式,以便在用户程序中调用时,明确这是来之DLL中的对话框资源。

由于,MFC规则DLL不允许导出整个类,以及类的成员函数,所以,为了保证用户程序能够
上述代码所作的工作是:
●声明一个导出显示对话框的函数接口;
●将对话框的头文件包含如MFC规则DLL的主CPP文件中;
●定义显示对话框的函数;
注意,建议在任何导出函数的函数体开始的位置加入:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
以保证,不管MFC库是如何链接到本DLL文件中的,都可以保证找到该对话框资源。

5. 编译链接后,该项目将生成两个主要输出文件:StaticMfcRegularDll.lib和StaticMfcRegularDll.dll。

6. 测试该MFC DLL,采用静态导入。

1)创建一个MFC SDI应用程序项目。

2)为了在测试项目中的任何派生类中都能导入到MFC Dll中的导出函数,我们在CWinApp
3)在测试项目中添加一个菜单资源,ID为ID_DLLTEST_DLLDLG。

并为该菜单添加一个命令处理程序,该处理程序添加给CFrameWnd派生类中。

然后,在该处理程序的实现中添加对导入函数ShowDlg的调用,即可。

7.测试该MFC Dll,采用动态导入。

1)MFC Dll的动态导入,与前面我们介绍的Win32 Dll的动态导入方式是相同的。

下面,就在静态导入测试项目的基础上,来实现对函数ShowDlg的动态导入。

2)我们要做两件的事情,就是定义一个与ShowDlg函数的对应的函数指针类型,然后修改前面的那个菜单资源的命令处理程序的实现。

下面这行代码,加入到CWinApp派生类的头文件中。

四、MFC 扩展动态链接库
MFC 扩展DLL与MFC 规则DLL的主要区别是,对于有MFC类派生的派生类,MFC扩展DLL可以导出整个类,而MFC规则DLL则不行。

1)创建一个“MFC DLL”项目。

名称为MfcExtDll;
2)配置“应用程序设置”为“MFC 扩展DLL”;
3)为项目添加一个对话框资源,ID为:IDD_DIALOG1;
4)为该对话框资源添加一个派生于CDialog的MFC派生类。

类名为CMyDllDlg;
5
AFX_EXT_CLASS。

6)由于,导入MFC扩展DLL的对话框类时,要求用户测试程序必须包含类的头文件,又因为对话框的头文件中包含了对话框的资源ID,因此在用户测试文件中还必须包含资源的头文件resource.h。

由于,用户测试程序中也会包含资源头文件resource.h,为了避免同一项目文件重名的冲突,因此,这里需要修改DLL项目中的资源头文件名。

然后,在下图所示的地方进行resource.h的文件名重命名。

7)编译链接后,项目会生成两个主要输出文件MfcExtDll.lib和MfcExtDll.dll。

接下来,就是对该MFC扩展Dll进行测试。

1)创建一个MFC SDI应用程序项目。

2
进行Dll的静态导入。

3)将MyDllDlg.h和dllresource.h两个头文件拷贝到该项目的根目录;
4)在项目中的CFrameWnd的派生类的实现文件中包含MyDllDlg.h。

5)为项目添加一个菜单项资源:ID_DLLTEST_DLLDLG,并为该菜单项添加命令处理程序到CFrameWnd的派生类中。

6
思考:
通过前面的操作之后,应该对于Dll的使用方式有了一个基本认识。

是否可以实现一个能通过动态链接库实现的用户界面语言在中英文间切换的对话款。

相关文档
最新文档