dll(动态链接库)的创建和使用
- 格式:docx
- 大小:2.81 MB
- 文档页数:35
控件注册方法控件是计算机程序中常用的一种元素,用于显示和交互。
在开发应用程序时,我们常常需要使用各种控件来实现各种功能。
但是,要使用一个控件,必须先将其注册到系统中,才能够在程序中使用。
本文将介绍几种常见的控件注册方法。
一、动态链接库(DLL)注册DLL是一种包含可重用代码和数据的文件,它可以被多个程序同时使用。
在使用DLL中的控件之前,我们需要先将DLL文件注册到系统中。
注册DLL文件的方法有两种:一种是使用Regsvr32命令,另一种是使用注册表编辑器。
1. 使用Regsvr32命令注册DLL文件的方法如下:a. 打开命令提示符窗口,定位到DLL文件所在的目录;b. 输入命令“Regsvr32 文件名.dll”,其中“文件名.dll”是要注册的DLL文件名;c. 按下回车键,等待注册完成的提示信息。
2. 使用注册表编辑器注册DLL文件的方法如下:a. 打开注册表编辑器,定位到HKEY_CLASSES_ROOT\CLSID;b. 在CLSID下创建一个新的子项,子项的名称是要注册的DLL 文件的GUID;c. 在新的子项下创建一个新的子项,子项的名称是控件的类名;d. 在控件的类名下创建一个新的子项,子项的名称是控件的版本号;e. 在控件的版本号下创建一个新的子项,子项的名称是InprocServer32;f. 在InprocServer32下创建一个新的字符串值,值的名称是“Default”,值的数据是DLL文件的完整路径。
二、ActiveX控件注册ActiveX控件是一种可以在Web浏览器中使用的控件,它可以用于实现各种动态交互的功能。
要使用ActiveX控件,我们需要先将其注册到系统中。
注册ActiveX控件的方法有两种:一种是使用Regsvr32命令,另一种是使用注册表编辑器。
1. 使用Regsvr32命令注册ActiveX控件的方法与注册DLL文件类似。
2. 使用注册表编辑器注册ActiveX控件的方法如下:a. 打开注册表编辑器,定位到HKEY_CLASSES_ROOT\CLSID;b. 在CLSID下创建一个新的子项,子项的名称是控件的GUID;c. 在新的子项下创建一个新的子项,子项的名称是控件的类名;d. 在控件的类名下创建一个新的子项,子项的名称是控件的版本号;e. 在控件的版本号下创建一个新的子项,子项的名称是InprocServer32;f. 在InprocServer32下创建一个新的字符串值,值的名称是“Default”,值的数据是控件的完整路径。
1.新建MFC DLL工程,取名为:DLL0410
动态链接库的创建和调用(类,函数的DLL导出和调用)
2.在工程中编辑好DLL0410.h,DLL0410.cpp,DLL0410.def三个文件后编译生成对应的dll和lib文件
2.1 DLL0410.h
2.2 DLL0410.cpp
2.3 DLL0410.def
2.4 编辑好上面的3个文件编译后,用dumpbin命令查看是否有函数导出。
(如图所示,sub全局函数和add类的成员函数已经导出)
3.新建一个工程DLL0410test将生成的DLL0410.dll,DLL0410.lib以及DLL0410.h文件拷贝到 DLL0410test工程目录下
4.静态调用:在工程的DLL0410test.cpp文件中导入头文件DLL0410.h,并编写对应的静态调用代码。
同时也要在工程属性链接中加入DLL0410.lib文件。
(如果编译出错有可能是,工程属性中的常规>>字符集>>修改为 使用多字节字符集)
运行成功
5.4.动态调用:只需将生成的DLL0410.dll文件拷贝到新建工程目录下,直接在工程的
DLL0410test.cpp中编写动态调用代码即可。
不用做其他任何连接和导入头文件的操作。
运行成功。
Windows动态链接库DLL使⽤⼀、概念DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时使⽤的代码和数据。
它是microsoft在windows操作系统中实现共享函数库概念的⼀种实现⽅式。
其中windows中⼀些作为DLL实现的⽂件有:ActiveX控件(.ocx)⽂件:如windows上的⽇历控件。
控制⾯板(.cpl)⽂件:控制⾯板中的每⼀项都是⼀个专⽤的DLL。
设备驱动程序(.drv)⽂件:如控制打印到打印机的打印机驱动程序。
⼆、由来DLL最初⽤于节约应⽤程序所需要的磁盘和内存空间。
早前,在传统的⾮共享库中,⼀部分代码简单地附加到调⽤的程序中。
如果两个程序同时调⽤同⼀个⼦程序,就会出现两份那段代码。
相反,许多应⽤共享的代码能够切分到⼀个DLL中,在硬盘上存为⼀个⽂档,在内存中只需使⽤⼀个实例。
三、DLL的优缺点优点:(1)节省内存和代码重⽤:当多个程序使⽤同⼀个函数库时,DLL可以减少在磁盘和物理内存中加载代码的重复量,且有助于代码的重⽤。
(2)模块化:DLL有助于促进模块式程序开发。
模块化允许仅仅更改⼏个应⽤程序共享使⽤的⼀个DLL中的代码和数据⽽不需要更改应⽤程序⾃⾝。
这种模块话的基本形式允许如Microsoft Office、Microsoft Visual Studio、甚⾄windows⾃⾝这样⼤的应⽤程序使⽤较为紧凑的补丁和服务包。
缺点:DLL Hell:即DLL地狱,指⼏个应⽤程序在使⽤同⼀个共享的DLL库时发⽣版本冲突。
究其原因,⼋个字:成也共⽤,败也共⽤。
因为DLL Hell正是由于动态链接库可与其他程序共⽤函数、资源所导致。
主要有两种情况:设想这样⼀个场景:程序A会使⽤1.0版本的动态链接库X,则在程序A安装到系统时,会同时安装该1.0版本的动态链接库X。
假设另⼀个程序B也会使⽤到动态链接库X,那么程序B直接复制到硬盘中即可正常运⾏,因为动态链接库已经存在于系统中。
[动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个DLL 副本的内容。
动态链接库(Dynamic Link Library或者Dynamic-link library,缩写为DLL),是微软公司在微软视窗操作系统(即Windows操作系统)中实现共享函数库概念的一种方式。
这些库函数的扩展名是.DLL、.OCX(包含ActiveX控制的库)或者.DRV(旧式的系统驱动程序)。
动态链接库缩写为DLL,在电脑中可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。
例如,您有一个大型网络游戏,如果把整个数百MB 甚至数GB的游戏的代码都放在一个应用程序里,日后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个动态链接库(DLL)中,您无需重新生成或安装整个程序就可以应用更新。
]1.使用VC6.0 生成DLL新建项目“Win32 Dynamic-Link Library”,输入项目名称,确定后选择“A simple DLL project”点击“完成”。
以下为cpp文件自动生成的代码:#include "stdafx.h"BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){return TRUE;}编辑cpp文件:在#include "stdafx.h"的下一行加入extern "C" __declspec(dllexport) int fun(int a, int b);/*这是C格式导出函数;这种写法一般用在C++写的DLL中,指按C的规则导出这个函数,否则导出的函数会很怪; 加上extern "C" 表示按标准C格式导出函数.如果去掉仅兼容C++;其中int fun(int a, int b) 这部分代码是我们想用dll 实现的函数原型声明如果还想加入其他的可以继续加入extern "C" __declspec(dllexport) int fun1(int a, int b);*/DllMain 是DLL 的默认入口函数,类似于C语言的main函数,该例子无需修改此处,在DllMain 的后面加入:int fun(int a,int b){return a+b;}这就是我们想用DLL 实现的函数的定义,build 之后就会在debug 目录下生成我们想要的dll 文件2.调用DLL新建一个Win32 Console Application 工程,把刚才生成的dll 文件拷贝到工程的根目录下在stdafx.h 文件中加入:#include <windows.h>编辑cpp文件:#include "stdafx.h"typedef int (*PFUN)(int,int);void main(){HMODULE hModule = ::LoadLibrary("dlltest.dll");PFUN newfun = (PFUN)::GetProcAddress(hModule,"fun");int i = newfun(1,2);printf("The result is %d\n",i);::FreeLibrary(hModule);}然后,运行就可以看到结果了转VC6.0下调用Dll文件提供的函数接口和全局变量函数接口:首先把生成的Dll文件(如RegularDll.dll和RegularDll.lib)拷贝到当前工程所在文件夹,调用有两种方法:1)动态方法:使用LoadLibrary和GetProcAddress等函数,例typedef void (*lpFun)(void);HINSTANCE hDll;hDll = LoadLibrary("RegularDll.dll");if (NULL==hDll) {MessageBox("Dll load failed!");}lpFun pShowDlg = (lpFun)GetProcAddress(hDll,"ShowDlg");if (NULL == pShowDlg) {MessageBox("Load function \"ShowDlg\" failed!");}pShowDlg();*/2)静态声明方法:创建Dll的工程中,函数声明和定义时用_stdcall 修饰,例void _stdcall ShowDlg(void){...}在调用dll的工程的文件中,在文件头部声明库和函数,如下例#pragma comment(lib,"RegularDll.lib")void _stdcall ShowDlg(void);调用时直接ShowDlg()就可以了。
vs2010创建和使用动态链接库(dll)1、打开Microsoft Visual Studio 2010,选择File->New->Project。
2、在New Project中选择Installed Templates->VisualC++->Win32。
3、选择Win32 Console Application,设置名称:simpledll,设置解决方案名:zdddll。
4、单击OK,在出现的Win32 Application Wizard的Overview 对话框中点击Next。
5、在Application Settings中,选择Application type下的DLL。
6、勾选Additional options下的Empty project。
7、单击Finish创建项目。
向动态链接库添加类:1、添加新类头文件。
右键单击simpledll项目,Add->New Item,选择Header File(.h),设置名称为simpledll,单击Add。
2、添加新类源文件。
右键单击simpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为simpledll,单击Add。
3、为新类添加内容。
内容如下:头文件simpledll.h:[html] view plain copy print?//------------------ simpledll.h---------------- #pragma once; //该宏完成在dll项目内部使用__declspec(dllexport)导出//在dll项目外部使用时,用__declspec(dllimport)导入//宏DLL_IMPLEMENT在simpledll.cpp中定义#ifdef DLL_IMPLEMENT #define DLL_API __declspec(dllexport) #else #define DLL_API__declspec(dllimport) #endif namespace zdd { //导出类class DLL_API SimpleDll { public: SimpleDll(); ~SimpleDll(); int add(int x, int y); //简单方法}; }源文件simpledll.cpp:[cpp] view plain copy print?//------------------ simpledll.cpp---------------- //注意此处的宏定义需要写在#include "simpledll.h"之前//以完成在dll项目内部使用__declspec(dllexport)导出//在dll项目外部使用时,用__declspec(dllimport)导入#define DLL_IMPLEMENT#include "simpledll.h" namespace zdd{ SimpleDll::SimpleDll() { } SimpleDll::~SimpleDll() { } intSimpleDll::add(int x, int y) { returnx+y; } } 4、完成后点击Build->Build Solution,生成解决方案。
使用vs建立动态链接库dll的过程和使用方法创建动态链接库(DLL)的过程可以分为几个步骤。
我将使用Visual Studio 来演示这个过程:创建DLL的步骤:1.打开Visual Studio,选择“文件”->“新建”->“项目”。
2.在新项目窗口中,选择“Visual C++”->“Windows桌面向导应用程序”。
3.输入项目名称和位置,然后点击“确定”。
4.在“解决方案资源管理器”中,右键单击项目名称->添加->新建项。
5.在“添加新项”窗口中,选择“DLL”,输入DLL名称,然后点击“添加”。
编写DLL代码:现在你已经有了一个空的DLL,你可以开始编写你的代码了。
例如,你可以添加以下代码到你的.cpp文件中:在这个例子中,我们创建了一个简单的函数add,它接收两个整数并返回它们的和。
extern "C"部分告诉编译器使用C链接规则创建导出函数,__declspec(dllexport)部分使得该函数可以从DLL中导出。
编译和生成DLL:在Visual Studio中,你可以通过点击“生成”菜单然后选择“生成解决方案”来编译和生成你的DLL。
如果编译成功,你可以在你的项目文件夹的Debug或Release 文件夹中找到生成的DLL文件。
使用DLL:使用DLL的过程可以分为几个步骤:1.加载DLL:使用Windows API函数LoadLibrary可以加载DLL。
例如:HMODULE hMod = LoadLibrary(TEXT("MyDLL.dll"));。
这个函数会返回一个模块句柄,如果DLL加载成功的话。
2.获取函数地址:使用GetProcAddress函数可以获取DLL中函数的地址。
例如:add_proc = (int (*)(int, int))GetProcAddress(hMod, "add");。
动态链接库的创建与使用动态链接库(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`函数获取函数地址,在调用函数时可以直接使用获取到的函数地址来执行相应的操作。
一、动态链接库什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是Dynamic Link Library 的缩写形式,动态链接库(DLL) 是作为共享函数库的可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个DLL 中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个DLL 副本的内容。
和大多数程序员一样,你一定很使用过DLL吧。
也曾感受到它的带给你程序设计和编码上的好错吧今天我想和大家探讨一个主题:如何在C#创建和调用DLL(动态链接库), 其实在很大意义上而讲,DLL让我更灵活的组织编写我们的应用程序,作为软件设计者,可一个根据它来达到很高的代码重用效果。
下面我来介绍一下在C#中如何创建和调用DLL。
二、准备工作我们需要对我们接下来要做的事情做个简单的介绍,在本文我们将利用C#语言创建一个名为MyDLL.DLL的动态链接库,在这个动态链接库文件中我们将提供两个功能一个是对两个参数交换他们的值,另一个功能是求两个参数的最大公约数。
然后创建一个应用程序使用这个DLL。
运行并输出结果。
1、MySwap.csnamespace MyMethods{public class SwapClass{public static bool Swap(ref long i,ref long j){i = i+j;j = i-j;i = i-j;return true;}}}2、MyMaxCD.csnamespace MyMethods{public class MaxCDClass{public static long MaxCD(long i, long j){long a,b,temp;if(i>j){a = i;b = j;}else{b = i;a = j;}temp = a % b;while(temp!=0){a = b;b = temp;temp = a % b;}return b;}}}需要注意的是:我们在制作这两个文件的时候可以用Visual 或者其他的文本编辑器,就算是记事本也可以。
DLL的创建与调用1、DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。
这些可以直接拿来使用。
静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式。
静态链接库把最后的指令都包含在最终生成的EXE 文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
(2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
动态链接库的分类:Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
非MFC动态库不采用MFC 类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
2、创建一个DLL2.1 非MFC的DLL2.1.1声明导出函数:extern “C” __declspec(dllexport) int add(int a, int b);其中extern “C”为声明为C编译。
由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。
这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。
__declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数从dll中声明输出函数有两种方式:(1)另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
在VS2017中创建和使用动态库DLL一、在VS2017中创建DLL动态库1、运行VS2017,选择:新建->项目->Visual C++ ->Windows桌面->动态库(DLL),选择保存项目位置,输入项目名称(也是动态库的名称),确定。
2、给项目添加头文件:15MyDLL.h,4、在头文件中,写入代码:#ifndef EXPORT_DLL//如果没有在项目配置属性->C/C++ ->预处理器定义了“EXPORT_DLL”#define EXPORT_API __declspec(dllimport) //宏定义__declspec(dllimport)为EXPORT_API,即为导入,从DLL中导入到应用程序#else//否则(如果在于处理器定义了EXPORT_DLL)#define EXPORT_API__declspec(dllexport) //EXPORT_API 被定义成导出__declspec(dllexport),从DLL中输出变量、函数或类等#endif// !EXPORT_DLL添加全局变量、函数和类:extern EXPORT_API float const PII = 3.14159; //导出一个常变量,要赋初值,在头文件中,要用extern修饰为全局变量,EXPORT_API float圆面积(float); //导出一个函数public:球体();~球体(); private:};给类添加变量:给类添加成员函数:5、生成DLL动态库:注意:在*.cpp中,#include "stdafx.h"要在#include "15MyDLL.h"前面哦,不然会有一堆错误出现!#include "stdafx.h"在前,就没有出错。
6、将生成的DLL对应的*.dll、*.lib和*.h复制出来,拷贝到应用程序中项目中,导出相应的变量、函数和类。
MFC创建动态链接库DLL并调⽤⽅法详解实例⼀:1、创建⼀个动态链接库⼯程,如login_dll。
2、在原⼯程头⽂件或者新建头⽂件如showdlg.h定义动态链接库的导出函数,代码如下:#include "stdafx.h"#define EXPORT __declspec(dllexport)extern "C" EXPORT void __stdcall Showdialg(char* pText);3、在动态链接库源⽂件中定义showdialog函数,代码如下:void _stdcall Showdialg(char* pText){MessageBox(NULL,pText,"提⽰⼀",0);}注:此步编译后,即可⽣成dll与lib⽂件,因为_stdcall是⼀种⽐较流⾏的函数调⽤约定,(或者可以不⽤_stdcall),如果使⽤的时候,为了防⽌发⽣函数命令改编的情况,可以定义⼀个.def⽂件,其中加⼊EXPORTS节,设置导出函数名,如下所⽰:LIBRARY "login_dll"EXPORTSShowdialg = Showdialg4、创建⼀个基于对话框的⼯程。
5、定义⼀个函数指针类型,其定义与动态链接库的函数原型相同,代码如下:typedef void (__stdcall * funShowInfo)(char* pchData);6、处理按键单击事件,加载动态链接库,代码如下:void Cuse_login_dllDlg::OnBnClickedOk(){HMODULE hMod = LoadLibrary("login_dll.dll");if (hMod != NULL){funShowInfo ShowInfo;ShowInfo = (funShowInfo)GetProcAddress(hMod,"Showdialg");if (ShowInfo)ShowInfo("传⼊参数成功且调⽤正常");}FreeLibrary(hMod);}其中,第5步与第6步是通过LoadLibrary函数动态加载链接库的⽅法,下⾯介绍⼀下静态加载链接库的⽅法:1、加载链接库的头⽂件,将动态链接库头⽂件拷贝到当前⼯程中,并在当前⼯程头⽂件进⾏声明。
dll文件注册方法一、什么是dll文件?DLL(Dynamic Link Library)指的是动态链接库,是一种可重复使用的代码和数据的集合,它可以被多个程序同时使用。
DLL文件通常包含一些函数、数据和资源,当程序需要使用这些函数、数据和资源时,可以通过调用DLL文件中的函数来实现。
二、为什么要注册dll文件?在使用某些软件或程序时,可能会出现缺少dll文件的情况。
为了能够正常使用这些软件或程序,就需要注册相应的dll文件。
注册dll文件可以让操作系统知道该文件的存在,并将其加载到内存中,使得软件或程序可以正常运行。
三、dll文件注册的方法1. 使用命令行注册打开命令提示符窗口,输入以下命令:regsvr32 /s <dll文件路径>其中,/s参数表示静默注册,即不显示注册提示信息。
dll文件路径指的是需要注册的dll文件所在的完整路径。
按下回车键,等待注册完成即可。
2. 使用注册表编辑器注册打开注册表编辑器,定位到以下注册表项:HKEY_CLASSES_ROOT\CLSID在CLSID下找到与dll文件对应的GUID(全局唯一标识符),双击打开该注册表项。
在默认值字段中,输入dll文件的完整路径,然后保存并关闭注册表编辑器。
3. 使用注册表脚本注册创建一个文本文件,将以下内容复制到文件中:Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}]@="dll文件描述"[HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InProcServer32]@="dll文件路径" "ThreadingModel"="Apartment"将上述内容中的{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}替换为dll文件对应的GUID,将"dll文件描述"替换为dll文件的描述信息,将"dll文件路径"替换为dll文件的完整路径。
Regsvr32注册.dll动态链接库【使⽤篇】1. Regsvr 32命令是Windows中控件⽂件(如扩展名为DLL、OCX、CPL的⽂件)的注册和反注册⼯具。
命令格式 Regsvr32 [/s] [/n] [/i[:cmdline]] dllname /u 卸载安装的控件,卸载服务器注册; /s 注册成功后不显⽰操作成功信息框; /i 调⽤DllInstall函数并把可选参数[cmdline]传给它,当使⽤/u时⽤来卸载DLL; /n 不调⽤DllRegisterServer,该参数必须和/i⼀起使⽤。
2. 简单实例 要⼿⼯注册“E:\\CPCW.dll”,只需在“开始→运⾏”中键⼊“Regsvr32 E:\\CPCW.dll”,单击“确定”按钮后会弹出提⽰信息“DllRegisterServer in CPCW.dll succeeded”,说明组件注册成功;如果要卸载此组件,在“开始→运⾏”中键⼊“Regsvr32 /u E:\\CPCW.dll”即可。
格式:regsvr32 [/s] [/n] [/i[:cmdline]] DLLname使⽤参数--------解除服务器注册使⽤参数[/s]--------⽆声;不显⽰消息框使⽤参数---------调⽤DllInstall,给其传递⼀个可选[cmdline];跟/u参数⼀起使⽤时卸载DLL。
使⽤参数[/n]--------不⽤调⽤DLLRegisterServer。
这个参数必须跟/i⼀起使⽤。
实例1:IE⽆法打开新窗⼝ regsvr32 actxprxy.dll regsvr32 shdocvw.dll 重启后如果还不能解决 regsvr32 mshtml.dll regsvr32 urlmon.dll regsvr32 msjava.dll regsvr32 browseui.dll regsvr32 oleaut32.dll regsvr32 shell32.dll实例2:IE⽆法保存HTML格式⽂件 regsvr32 inetcomm.dll实例3:MSN⽆法登陆 regsvr32 softpub.dll实例4:windows默认的⽂件关联混乱 regsvr32 /i shdocvw.dll regsvr32 /i shell.dll regsvr32 /i shdoc401.dll实例5:Window server 2003中⽆法播放MP3 regsvr32 i3codeca.acm regsvr32 i3codecx.ax实例6:Windows添加/删除程序⽆法启动 regsvr32 mshtml.dll regsvr32 /i shdocvw.dll regsvr32 /i shell.dll实例7 Windows搜索功能故障 regsvr32 urlmon.dll实例8:禁⽌系统对媒体⽂件进⾏预览 regsvr32 /u shmedia.dll 恢复可⽤ regsvr32 shmedia.dll实例9:卸载Win XP⾃带的zip功能 regsvr32 /u zipfldr.dll实例10:禁⽤FSO对象 regsvr32 /u scrrun.dll 实例11:⽤户帐户打开后看不到⾥⾯的内容 regsvr32 nusrmgr.cpl 是⽤户账户的运⾏⽂件regsvr32 mshtml.dll 是HTML解释器相关模块 regsvr32 jscript.dll 是Microsoft javascript脚本⽀持相关⽂件 regsvr32 /i shdocvw.dll 是为Windows应⽤程序添加基础⽂件和⽹络操作相关模块⽤户帐户打开空⽩⼀般可能模块会出现问题,有的会出现⽐如模块找不到等管理員無法打開或設置⽤⼾權限解決⽅法: 執⾏:regsvr32 uscript.dll regsvr32 mshtml.dll 切换⽤户出现警⽰提⽰,“⾼级INF安装程序” “错误:⽆法定位INF⽂件C:\WINDOWS\INF\icw.inf regsvr32 MSHTML.DLL。
dll注册方法DLL注册方法什么是DLL注册?DLL(动态链接库)是在Windows操作系统中常见的文件类型,它包含可重用的代码和资源,可由多个应用程序共享和调用。
而DLL注册是将DLL文件在操作系统中注册,以使操作系统能够找到和使用它们。
方法一:使用命令行注册DLL1.打开命令提示符窗口:点击开始菜单,输入”cmd”并按下回车键。
2.切换到DLL文件所在的目录:使用cd命令切换到DLL文件所在的目录,例如cd C:\Windows\System32。
3.注册DLL文件:使用regsvr32命令注册DLL文件,例如regsvr32。
方法二:使用注册表注册DLL1.打开注册表编辑器:点击开始菜单,输入”regedit”并按下回车键。
2.找到DLL文件对应的注册表项:依次展开HKEY_CLASSES_ROOT、CLSID,找到与DLL文件对应的注册表项。
3.添加或修改注册表键值:右键单击注册表项,选择”新建”或”修改”,根据DLL文件的要求添加或修改相应的键值。
方法三:使用命令行工具(例如RegsvrEx)注册DLL1.下载并安装合适的命令行工具:例如RegsvrEx。
2.打开命令提示符窗口:点击开始菜单,输入”cmd”并按下回车键。
3.切换到命令行工具所在的目录:使用cd命令切换到命令行工具所在的目录,例如cd C:\Tools。
4.注册DLL文件:使用命令行工具提供的命令,例如RegsvrEx/i。
方法四:使用批处理文件注册DLL1.打开文本编辑器(例如Notepad):点击开始菜单,输入”notepad”并按下回车键。
2.编写批处理文件:按照以下格式编写批处理文件,并保存为以.bat为后缀的文件。
@echo offregsvr323.运行批处理文件:双击批处理文件运行,DLL文件将会被注册到操作系统中。
注意事项•确保以管理员权限运行命令行工具或批处理文件。
•在注册DLL文件之前,确认DLL文件是否与操作系统兼容。
一.创建动态链接库(.dll)要点与步骤1.创建Java工程,定义接口类publicclass Nadd {static {System.loadLibrary("Nadd");//这是调用名为Nadd的动态库}publicnativeint nadd(int a, int b);//特别注意加上native关键字}2.打开DOS命令窗口,进入到Nadd类所在目录利用Java自带的javah–jni加上需编译的类名即可在当前目录生成.h文件3.打开VS2008编译工具,新建工程(注意:新建工程的名字与在Java中调用的库的名字相同,如:Nadd)4.将生成的.h文件拷贝到新建工程的头文件目录里面,打开该.h文件,加入“#include"stdafx.h"”保存不做任何修改5.在源文件中创建和.h文件名一样的源文件,后缀.cpp6.打开.cpp文件,把如下拷贝粘贴到该文件中#include"windows.h"#include"com_NativeCode_Nadd.h"#include"stdafx.h"#include<stdlib.h>以下是在.h头文件中声明的方法,该例子直接返回两数之和JNIEXPORT jint JNICALL Java_com_NativeCode_Nadd_nadd(JNIEnv *env, jobject c, jint a, jint b){return (a+b);}7.打开“stdafx.h”头文件加入刚才生成的头文件。
在该例子中#include"com_NativeCode_Nadd.h"保存。
8.“项目”-→“XXX的属性”-->“配置属性”-→“c/c++”-→“附加包含目录”添加Jdk的include和win32两个目录:"C:\Program Files\Java\jdk1.7.0_07\include";"C:\Program Files\Java\jdk1.7.0_07\include\win32"9.完成之右单击项目名字,选择“生成”就ok了10.在VS2008工作空间找到该项目,进入到该Debug目录下就会找到XXX.dll文件,将该文件拷贝到jdk包下的bin目录下就可以实现Java调用了。
在DLL中使用资源在动态链接库(DLL)中使用资源是一种非常重要的技术。
资源是指在程序运行过程中使用到的非代码数据,例如图像、文本、音频等。
将资源嵌入到DLL中,可以使程序更加灵活和易于维护。
1. 创建DLL工程:首先需要创建一个DLL项目,可以使用不同的开发工具(如Visual Studio)来创建。
创建工程后,可以开始添加资源。
2.添加资源文件:在DLL工程中,可以通过添加资源文件的方式来添加所需的资源。
这些资源通常是被源码文件所引用和使用的。
资源文件可以是图像文件、音频文件、文本文件等。
3.资源的嵌入:在资源文件中,每个资源都有一个唯一的标识符,在代码中可以通过该标识符来引用资源。
将资源文件嵌入到DLL中,可以使用资源编译器将资源文件编译成二进制格式,并将其链接到DLL文件中。
4.使用资源:在DLL的源码文件中,可以通过资源标识符来调用和使用资源。
可以使用资源的标识符来加载和获取资源的数据。
根据资源的类型,可以选择不同的函数来处理和使用资源。
下面是一个使用DLL资源的例子:```C++#include <windows.h>#include <iostream>//定义资源ID#define ID_MY_TEXT_RESOURCE 101//资源回调函数BOOL CALLBACK MyResourceEnumProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG_PTR lParam)//检查资源类型和名称if (IS_INTRESOURCE(lpszType) && (lpszName ==ID_MY_TEXT_RESOURCE))//加载资源HRSRC hResource = FindResource(hModule, lpszName, lpszType);HGLOBAL hGlobal = LoadResource(hModule, hResource);DWORD dwSize = SizeofResource(hModule, hResource);LPVOID lpBuffer = LockResource(hGlobal);//使用资源(这里假设是一个文本资源)if (lpBuffer != NULL)std::cout << "Resource: " << (LPCTSTR)lpBuffer << std::endl;}//释放资源FreeResource(hGlobal);//标记已找到资源return FALSE;}return TRUE;//DLL入口点函数BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)//判断DLL载入完成if (dwReason == DLL_PROCESS_ATTACH)//枚举资源EnumResourceNames(hModule, RT_RCDATA, MyResourceEnumProc, 0);}return TRUE;```在上面的代码中,我们定义了一个文本资源标识符`ID_MY_TEXT_RESOURCE`,然后在资源回调函数中通过资源标识符加载和使用资源。
动态链接库和静态库的创建及使用教程第一部分静态库(以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.若要为新类创建源文件,请从“项目”菜单中选择“添加新项…”。
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文件名。
( 函数DllMain 的缺省实现也可以去掉)步骤4:从工程中删掉文件main.cpp,main.h 步骤5:继续修改文件mydll.h和mydll.cpp 在mydll.h中添加两个函数, add和value在mydll.cpp中给出这两个函数的实现。
步骤6:编译并生成dll文件点击齿轮图标(编译),生成dll文件。
打开我的电脑或资源管理器,可以查看生成的文件目录。
E:\WorkSpace\CodeBlocksApps\MyDll目录下(本演示的工程目录):E:\WorkSpace\CodeBlocksApps\MyDll\bin\Debug:(若选择Release版,则Release子目录)至此:我们就得到了四个有用的文件。
Mydll.h: 头文件。
编写调用该dll的exe工程时,要用到。
Mydll.dll :目标dll文件,要随调用该dll的exe文件一起发布。
libmydll.a: 含有mydll.dll中导出函数的地址信息的静态库。
在编译调用方的工程时,在链接(Link)阶段, 可能会用到。
在使用其他平台和其他编译器时,该文件的扩展名可能为.lib.libMydll.def :导出函数的定义文件(文本文件),内容如下:第二部分以间接调用的方式使用.dll (使用上边创建的mydll.dll)步骤1:新建一个控制台工程(UseDll.cbp).步骤2:修改main.cpp。
//main.cpp#include <iostream>using namespace std;#include "..\\MyDll\\mydll.h"int main(){typedef void (*FuncTypeSome)(LPCSTR);typedef int (*FuncTypeAdd)(int);typedef float (*FuncTypeVal)(float,float);HINSTANCE hDll = LoadLibrary("MyDll.dll");if (hDll==nullptr) {cout<<"Load Library Failed."<<endl;return 1;}FuncTypeSome some = (FuncTypeSome)GetProcAddress(hDll,"SomeFunction");FuncTypeAdd addFunc = (FuncTypeAdd)GetProcAddress(hDll,"add");FuncTypeVal valFunc = (FuncTypeVal)GetProcAddress(hDll,"value");some("Call SomeFunction.");cout<<"add(88)="<<addFunc(88)<<endl;cout<<"value(2.5,1.2)="<<valFunc(2.5,1.2)<<endl;FreeLibrary(hDll);cout << "Hello world!" << endl;return 0;}这部分说明:LoadLibrary()是Window API函数,加载库文件,返回一个指针(也称句柄)。
typedef void (*FuncType)(const LPCSTR),是声明类型名FuncType,表示FuncType的每一个变量都是形如void XXXX(const LPCSTR)的某个函数。
GetProcAddress也是Window API函数,取得库中指定名字的函数入口地址。
如图:步骤3:编译,生成UseDll.exe步骤4:拷贝mydll.dll到UseDll.exe所在目录步骤5:执行UseDll.exe,输出:间接调用Dll的好处程序员可以在程序中(如UseDll.exe)中,动态地(或者称运行时期)决定具体调用哪个dll中的的哪个函数。
例如,plug_in(插件)就是一个dll,通常就需要这种方式决定调用哪个插件中的函数。
第三部分以直接调用的方式使用.dll (使用上边创建的mydll.dll)步骤1:改写main.cpp(注释掉部分,改用原始名字调用,最后代码如下)// main.cpp#include <iostream>using namespace std;#include "..\\MyDll\\mydll.h"int main(){/**typedef void (*FuncTypeSome)(LPCSTR);typedef int (*FuncTypeAdd)(int);typedef float (*FuncTypeVal)(float,float);HINSTANCE hDll = LoadLibrary("MyDll.dll");if (hDll==nullptr) {cout<<"Load Library Failed."<<endl;return 1;}FuncTypeSome some = (FuncTypeSome)GetProcAddress(hDll,"SomeFunction");FuncTypeAdd addFunc = (FuncTypeAdd)GetProcAddress(hDll,"add");FuncTypeVal valFunc = (FuncTypeVal)GetProcAddress(hDll,"value");some("Call SomeFunction.");cout<<"add(88)="<<addFunc(88)<<endl;cout<<"value(2.5,1.2)="<<valFunc(2.5,1.2)<<endl;FreeLibrary(hDll);**/SomeFunction("Call SomeFunction");cout<<"add(88)="<<add(88)<<endl;// mydll.h中的原始名字cout<<"value(2.5,1.2)="<<value(2.5,1.2)<<endl; // mydll.h中的原始名字cout << "Hello world!" << endl;return 0;}如图:步骤2:添加mydll.dll的静态导出库到UseDll工程中此时编译,会报错。
如图:表明编译器在链接(Link)时,找不到三个函数_imp__SomeFunction, _imp__add,_imp__value 的入口地址,也就是没找到这三个函数的具体实现部分。
但这三个函数的名字明显不是我们自己定义的,实际上这些名字是mydll.dll中对SomeFunction,add,value函数的内部表示名,他们的实现必定在mydll.dll中,而不会在UseDll工程中,当然就找不到了。