dll调用
- 格式:docx
- 大小:36.40 KB
- 文档页数:11
clr dll 调用方法### CLR DLL 调用方法详解#### 导语在.NET开发中,CLR(公共语言运行时)扮演着核心角色,负责程序的执行和管理。
有时,开发者需要从非托管代码中调用托管DLL,或者反之。
本文将详细介绍如何在不同环境下调用CLR DLL,并确保操作的正确性和效率。
#### 一、CLR与DLL概述CLR(Common Language Runtime)是.NET框架的一部分,负责执行托管代码。
托管代码指的是用.NET支持的任何语言编写的代码,如C#、等。
这些代码编译后生成的是中间语言(MSIL),由CLR进一步编译为机器码执行。
DLL(动态链接库)是一种包含可执行代码的文件,可在程序运行时被加载和调用。
在.NET中,托管DLL与传统的非托管DLL在结构上有显著差异。
#### 二、从非托管代码调用CLR DLL1.**使用P/Invoke:**P/Invoke(Platform Invocation Services)允许非托管代码调用托管DLL中的方法。
步骤如下:- 定义托管DLL中的方法为`public static extern`。
- 创建一个非托管程序,使用DllImport属性引入托管DLL,并调用定义的方法。
2.**使用C++/CLI:**C++/CLI是一种特殊的C++方言,允许开发者编写同时支持托管和非托管代码的程序。
通过C++/CLI,可以创建一个封装器(wrapper),将托管DLL中的方法暴露给非托管代码。
3.**使用COM接口:**将CLR组件注册为COM组件,然后在非托管代码中通过COM接口调用。
#### 三、从托管代码调用非托管DLL1.**使用DllImport:**- 在托管代码中使用`DllImport`属性引入非托管DLL。
- 创建一个与DLL中函数原型匹配的托管方法。
2.**使用C++/CLI:**与从非托管代码调用托管DLL相似,可以使用C++/CLI创建封装器,将非托管DLL的方法暴露给托管代码。
python调用dll的例程Python调用动态链接库(DLL)是一个强大的功能,可以增强Python的功能并将其与其他语言集成。
以下是Python调用DLL的例程:1. 导入ctypes模块首先,您需要导入ctypes模块。
ctypes模块允许Python调用DLL并使用其函数。
使用以下代码导入ctypes模块:import ctypes2. 定义DLL和函数接下来,您需要定义要使用的DLL和其中的函数。
在Windows中,您可以使用WinDLL函数定义DLL。
例如,如果您想要使用一个名为myDLL.dll的DLL并调用其中的一个名为myFunction的函数,则可以使用以下代码定义它们:myDLL = ctypes.WinDLL('myDLL.dll')myFunction = myDLL.myFunction3. 定义函数参数和返回值类型您需要定义函数的参数和返回值类型。
ctypes模块提供了一些类型,例如c_char_p和c_int。
例如,如果myFunction函数接受两个整数参数并返回一个整数,则可以使用以下代码定义它们:myFunction.argtypes = [ctypes.c_int, ctypes.c_int]myFunction.restype = ctypes.c_int4. 调用函数现在,您可以调用myFunction函数并传递参数。
使用以下代码调用函数并将结果存储在result变量中:result = myFunction(1, 2)5. 处理返回值最后,您需要处理函数的返回值。
在本例中,myFunction函数返回一个整数。
您可以使用以下代码打印结果:print(result)这就是Python调用DLL的例程。
您可以根据需要更改DLL和函数的名称以及参数和返回值类型。
Vs2010调用lib和dll的总结1.首先调用dll先用vs2010生成自己的dll文件,我命名为testdll.dll首先新建一个工程testdll,在工程中加入testdll.h和testdll.cpp testdll.h内容为:extern"C"int__declspec(dllexport) add(int,int);testdll.cpp内容为:#include<windows.h>#include"testdll.h"BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_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:break;}return TRUE;}int add(int a,int b){return a+b;}还有设置一下编译就生成了testdll.dll库文件再新建一个工程test在test里面建立一个test.cppTest.cpp内容:#include<windows.h>#include<iostream>#include<tchar.h>using namespace std;int main(){HINSTANCE hDll; //dll 句?柄À¨²hDll=LoadLibrary(TEXT("testdll.dll")); //加¨®载?dlltypedef int(* lpAddFun)(int,int); //宏¨º定¡§义°?函¡¥数ºy指?针?类¤¨¤型¨ªlpAddFun addFun; //函¡¥数ºy指?针?int * num;if(hDll!=NULL) //判D断?dll加¨®载?是º?否¤?成¨¦功|{addFun=(lpAddFun)GetProcAddress(hDll,"add"); //获?取¨?想?要°a引°y入¨?的Ì?函¡¥数ºy以°?及¡ã变À?量¢?num=(int *)GetProcAddress(hDll,"num");/* if(num!=NULL){printf("%d\n",* num);}*/if(addFun!=NULL){int result=addFun(3,2);printf("3+2=%d\n",result);}FreeLibrary(hDll); //卸?载?dll}getchar();return 0;}设置三个地方,就可以编译了第一:上面打红圈的就是把testdll.dll的路径添加上去第二:添加testdll.lib就可以了第三:就是把testdll.dll路径添加到环境变量PATH中,就可以了。
QT调⽤DLL⽅法(三种⽅法)Qt调⽤DLL⽅法⼀:使⽤Win32 API在显式链接下,应⽤程序必须进⾏函数调⽤以在运⾏时显式加载 DLL。
为显式链接到 DLL,应⽤程序必须:调⽤ LoadLibrary(或相似的函数)以加载 DLL 和获取模块句柄。
调⽤ GetProcAddress,以获取指向应⽤程序要调⽤的每个导出函数的函数指针。
由于应⽤程序是通过指针调⽤ DLL 的函数,编译器不⽣成外部引⽤,故⽆需与导⼊库链接。
使⽤完 DLL 后调⽤ FreeLibrary。
例如:typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);HINSTANCE hDLL; // Handle to DLLLPFNDLLFUNC1 lpfnDllFunc1; // Function pointerDWORD dwParam1;UINT uParam2, uReturnVal;hDLL = LoadLibrary(”MyDLL”);if (hDLL != NULL){lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,“DLLFunc1″);if (!lpfnDllFunc1){// handle the errorFreeLibrary(hDLL);return SOME_ERROR_CODE;}else{// call the functionuReturnVal = lpfnDllFunc1(dwParam1, uParam2);}}需要说明的是,typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);是声明想要调⽤的函数指针,这个函数的参数必须和DLL⾥⾯的⼀样。
DLLFunc1是DLL⾥⾯的“实际的函数名”,必须和头⽂件⾥⾯声明的⼀样,否则将会调⽤失败。
使⽤需要加Windows.h 头⽂件。
js异步调用dll方法在JavaScript(JS)中异步调用动态链接库(DLL)方法是Web开发中的一种高级技术,尤其在需要与底层操作系统进行交互的场景下。
本文将详细介绍如何使用JavaScript实现异步调用DLL的方法。
### JavaScript异步调用DLL方法#### 1.背景知识在JavaScript中调用DLL通常不是直接进行的,因为JavaScript是运行在浏览器中的脚本语言,而DLL是Windows操作系统中使用的动态链接库。
为了实现这一功能,我们通常需要借助一些额外的技术手段,如ActiveX或WebAssembly。
#### 2.使用ActiveX控件ActiveX控件允许在网页中嵌入Windows组件,实现JavaScript与DLL 的交互。
**步骤如下:**- 创建一个ActiveX控件,该控件负责调用DLL中的方法。
- 在网页中通过JavaScript使用该ActiveX控件。
**示例代码:**```javascript// 假设已经有一个名为MyActiveX的ActiveX控件var activeX = new ActiveXObject("MyActiveX.ActiveXComponent");// 异步调用DLL中的方法activeX.InvokeAsync("DLLMethod", function(result) {// 处理结果console.log(result);});```#### 3.使用WebAssemblyWebAssembly(Wasm)提供了一种方法,允许其他语言的代码在网页上运行,从而可以通过它来调用DLL。
**步骤如下:**- 使用Emscripten等工具将DLL中的方法编译成WebAssembly。
- 在网页中加载编译后的WebAssembly模块。
- 通过JavaScript调用WebAssembly模块中暴露的方法。
两个dll有同名函数调用规则-回复两个DLL有同名函数的调用规则在开发过程中,经常会遇到两个DLL(Dynamic Link Libraries)含有同名函数的情况。
这可能是因为两个不同的团队或者开发者在不同的时间或不同的项目中开发了相似的功能,因而产生了命名冲突。
在这种情况下,我们需要了解调用规则,以避免可能出现的问题。
一、了解Windows下的DLL概念在进一步探讨同名函数的调用规则之前,我们首先需要了解Windows下的DLL概念。
DLL是可执行文件的一种,它包含了一组函数和数据,可以在运行时被动态链接到程序中。
通过使用DLL,可以实现代码的模块化,提高代码复用性和可维护性。
在Windows中,每个DLL都有一个独立的地址空间。
这意味着,即使存在同名函数,它们在内存中也会有不同的地址。
因此,操作系统可以区分它们,不会产生命名冲突的问题。
二、了解函数命名冲突的影响尽管操作系统可以区分同名函数,但开发者在调用时可能会出现困惑和错误。
当代码中调用同名函数时,编译器无法确定具体调用哪个DLL中的函数。
这可能会导致编译错误或者在运行时产生意外的结果。
为了解决函数命名冲突的影响,我们需要采取一些措施来明确调用的是哪个DLL中的函数。
三、使用全限定名调用函数最简单的方法是使用全限定名来调用函数。
全限定名指的是使用DLL名称或者别名,以及函数名称来唯一标识函数。
通过这种方式,我们可以明确指定调用哪个DLL中的函数。
例如,在调用同名函数时,使用以下格式来调用:DLLName.FunctionName()其中,DLLName是指DLL的名称或别名,FunctionName是指待调用的函数名称。
四、通过显式加载指定DLL来调用函数另一种解决函数命名冲突的方法是通过显式加载指定DLL来调用函数。
在程序中,可以使用LoadLibrary函数来加载特定的DLL,并使用GetProcAddress函数获取函数地址。
通过这种方式,我们可以在运行时根据需要动态加载DLL,并明确调用特定DLL中的函数。
C++ 调用DLL方法①LIB文件直接加入到工程文件列表中在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。
②设置工程的 Project Settings来加载DLL的LIB文件打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。
③通过程序代码的方式加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。
因为,在Debug方式下,产生的LIB文件是Debug 版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。
静态链接库LIB和动态链接库DLL的区别1.什么是静态连接库,什么是动态链接库静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。
但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
静态链接库与静态链接库调用规则总体比较如下。
对于静态链接库(比较简单):首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。
生成库的.h头文件中的声明格式如下:extern "C" 函数返回类型函数名(参数表);在调用程序的.cpp源代码文件中如下:#include "..\lib.h"#pragma comment(lib,"..\\debug\\libTest.lib")//指定与静态库一起链接第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。
NET_如何生成DLL文件并且调用一、生成DLL文件:1. 打开Visual Studio(建议使用最新版本),选择“新建项目”。
3.输入项目名称,并选择保存路径,然后点击“确定”。
4. 之后,Visual Studio会自动生成一个类文件,这个文件是DLL的主要代码逻辑所在。
你可以在这个文件中编写需要封装为DLL的功能代码。
5. 在类文件中,你可以添加需要的类和方法,并且给这些方法添加合适的修饰符(比如public)来使得它们可以被其他程序调用。
6. 编写完成后,编译项目。
可以使用Debug模式进行调试,或者发布Release版本。
7. 编译完成后,会生成.dll文件,这个文件就是我们需要的DLL文件。
二、调用DLL文件:1.打开一个新的项目,比如一个控制台应用程序。
2.在项目中,右击“引用”文件夹,选择“添加引用”。
3.在弹出的对话框中,选择“浏览”选项卡,然后选择之前生成的DLL文件。
4.点击“确定”后,DLL文件就会被添加到项目的引用中。
5.在代码中,你可以通过使用DLL文件中的类和方法来调用DLL的功能。
需要先在代码中导入DLL的命名空间。
6. 创建一个DLL中的类的实例,并且调用其方法来使用功能。
比如,如果DLL中有一个Calculator类和一个Add方法,可以这样使用:Calculator calculator = new Calculator(;int result = calculator.Add(3, 4);Console.WriteLine(result); // 输出:7以上就是生成和调用DLL文件的基本步骤。
需要注意的是,生成DLL文件时,可以根据实际需要设置一些特定的属性,比如版本信息、项目引用等。
调用DLL文件时,需要确保DLL文件的路径正确,并且需要在项目中添加对DLL文件的引用。
总结起来,生成和调用DLL文件需要使用Visual Studio来创建和编译项目,同时需要合理地设置项目属性和引用。
一、概述Web服务是一种基于网络的应用程序接口,能够通过网络访问远程系统的功能。
通过Web服务可以轻松地将应用程序的功能暴露给其他应用程序或用户。
在实际开发中,经常需要调用动态信息库(DLL)中的方法来实现特定的功能。
本文将介绍如何通过Web服务调用DLL方法,以及一些注意事项和实际应用例子。
二、Web服务调用DLL方法的流程1. 创建Web服务在实现Web服务调用DLL方法前,首先需要创建一个Web服务。
可以使用Visual Studio等集成开发环境来创建Web服务项目,然后在项目中添加相应的DLL文件以及需要调用的方法。
2. 引用DLL文件在创建好Web服务项目后,需要将要调用的DLL文件引入项目中。
可以通过在项目中添加引用的方式来实现。
在Visual Studio中,可以右键点击项目 -> 添加引用 -> 浏览,然后选择相应的DLL文件。
3. 编写Web服务方法接下来需要在Web服务项目中编写具体的Web服务方法,用来调用DLL中的方法。
可以在代码中使用DLL文件的命名空间和类名,来实现对DLL方法的调用。
4. 部署Web服务在编写好Web服务方法后,需要将Web服务项目部署到服务器上。
可以选择将项目编译成可执行文件,然后将文件部署到IIS等Web服务器上,以便其他应用程序能够访问。
5. 调用Web服务可以通过其他应用程序或者通过浏览器等方式来调用Web服务。
通过指定Web服务的位置区域和方法名,可以实现对DLL方法的调用,并获取相应的结果。
三、注意事项1. 权限控制在调用Web服务时,需要注意对权限的控制。
可以通过在Web服务中添加认证机制和授权机制,来保护Web服务的安全性。
2. 异常处理在调用DLL方法时,可能会出现各种异常情况,如参数错误、网络连接问题等。
需要在Web服务中加入相应的异常处理机制,来保证系统的稳定性和可靠性。
3. 参数传递在调用DLL方法时,需要注意参数的传递方式。
目录∙引言∙调用方式∙MFC中的DLL∙DLL入口函数∙关于调用约定∙关于DLL的函数∙模块定义文件(.DEF)∙DLL程序和调用其输出函数的程序的关系引言比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。
可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。
在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。
W indows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的DLL (Dy namic Linkab le L ibrary) 文件,并可对它们单独编译和测试。
在运行时,只有当EXE 程序确实要调用这些DLL 模块的情况下,系统才会将它们装载到内存空间中。
这种方式不仅减少了EXE 文件的大小和对内存空间的需求,而且使这些DLL 模块可以同时被多个应用程序使用。
W indows 自己就将一些主要的系统功能以DLL 模块的形式实现。
一般来说,DLL 是一种磁盘文件,以.dll、.DRV、.FO N、.SYS 和许多以.EXE 为扩展名的系统文件都可以是DLL。
它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。
如果与其它DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。
DLL 模块中包含各种导出函数,用于向外界提供服务。
DLL 可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个DLL 在内存中只有一个实例;DLL 实现了代码封装性;DLL 的编制与具体的编程语言及编译器无关。
在W in32 环境中,每个进程都复制了自己的读/写全局变量。
如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。
DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。
W indows 在加载DLL模块时将进程函数调用与DLL 文件的导出函数相匹配。
W indows 操作系统对DLL 的操作仅仅是把DLL 映射到需要它的进程的虚拟地址空间里去。
DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。
调用方式1、静态调用方式:由编译系统完成对DLL 的加载和应用程序结束时DLL 卸载的编码(如还有其它程序使用该DLL,则W indows 对DLL 的应用记录减1,直到所有相关程序都结束对该DLL 的使用时才释放它,简单实用,但不够灵活,只能满足一般要求。
隐式的调用:需要把产生动态连接库时产生的.L IB 文件加入到应用程序的工程中,想使用DLL 中的函数时,只须说明一下。
隐式调用不需要调用LoadLibrary() 和FreeL ibrary()。
程序员在建立一个DLL 文件时,链接程序会自动生成一个与之对应的LIB 导入文件。
该文件包含了每一个DLL 导出函数的符号名和可选的标识号,但是并不含有实际的代码。
L IB 文件作为DLL 的替代文件被编译到应用程序项目中。
当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB 文件中导出符号相匹配,这些符号或标识号进入到生成的EXE 文件中。
LIB 文件中也包含了对应的DL L文件名(但不是完全的路径名),链接程序将其存储在EXE 文件内部。
当应用程序运行过程中需要加载DLL 文件时,W indows 根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL 函数的动态链接。
所有被应用程序调用的DLL 文件都会在应用程序EXE 文件加载时被加载在到内存中。
可执行程序链接到一个包含DLL 输出函数信息的输入库文件(.L I B文件)。
操作系统在加载使用可执行程序时加载DLL。
可执行程序直接通过函数名调用DLL 的输出函数,调用方法和程序内部其它的函数是一样的。
2、动态调用方式:是由编程者用API 函数加载和卸载DLL 来达到调用DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
显式的调用:是指在应用程序中用LoadLibrary或MFC 提供的Afx LoadLibrary显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用GetProcAddress() 获取想要引入的函数。
自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了。
在应用程序退出之前,应该用FreeL ibrary或MFC 提供的Afx FreeL ibrary释放动态连接库。
直接调用W in32 的LoadLibary函数,并指定DLL 的路径作为参数。
LoadLibary返回HINSTANCE 参数,应用程序在调用GetProcAddress 函数时使用这一参数。
GetProcAddress 函数将符号名或标识号转换为DLL 内部的地址。
程序员可以决定DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个DLL 文件。
使用DLL 的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用GetProcAddress 函数得到输出函数的指针,在退出之前必须卸载DLL(FreeL ibrary)。
W indows将遵循下面的搜索顺序来定位DLL:1.包含EXE文件的目录2.进程的当前工作目录3.W indows系统目录4.W indows目录5.列在Path 环境变量中的一系列目录MFC中的DLL∙Non-MFC DLL:指的是不用MFC 的类库结构,直接用 C 语言写的DLL,其输出的函数一般用的是标准 C 接口,并能被非MFC 或MFC 编写的应用程序所调用。
∙Regular DLL:和下述的Ex tension DLLs 一样,是用MFC 类库编写的。
明显的特点是在源文件里有一个继承CW inApp 的类。
其又可细分成静态连接到MFC 和动态连接到MFC 上的。
静态连接到MFC 的动态连接库只被VC 的专业版和企业版所支持。
该类DLL 应用程序里头的输出函数可以被任意W in32程序使用,包括使用MFC 的应用程序。
输入函数有如下形式:ex tern "C" EXPORT YourEx portedFunction();如果没有ex tern "C" 修饰,输出函数仅仅能从C++ 代码中调用。
DLL 应用程序从CW inApp 派生,但没有消息循环。
动态链接到MFC 的规则DLL 应用程序里头的输出函数可以被任意W in32 程序使用,包括使用MFC 的应用程序。
但是,所有从DLL 输出的函数应该以如下语句开始:AFX_MANAGE_STATE(AfxGetStaticModuleState( ))此语句用来正确地切换MFC 模块状态。
Regular DLL能够被所有支持DLL 技术的语言所编写的应用程序所调用。
在这种动态连接库中,它必须有一个从CW inApp 继承下来的类,DLLMain 函数被MFC 所提供,不用自己显式的写出来。
Extension DLL:用来实现从MFC 所继承下来的类的重新利用,也就是说,用这种类型的动态连接库,可以用来输出一个从MFC 所继承下来的类。
它输出的函数仅可以被使用MFC 且动态链接到MFC 的应用程序使用。
可以从MFC 继承你所想要的、更适于你自己用的类,并把它提供给你的应用程序。
你也可随意的给你的应用程序提供MFC 或MFC 继承类的对象指针。
Ex tension DLL使用MFC 的动态连接版本所创建的,并且它只被用MFC 类库所编写的应用程序所调用。
Ex tension DLLs 和Regular DLLs 不一样,它没有从CW inApp 继承而来的类的对象,所以,你必须为自己DLLMain 函数添加初始化代码和结束代码。
和规则DLL 相比,有以下不同:1、它没有从CW inApp 派生的对象;2、它必须有一个DLLMain 函数;3、DLLMain 调用Afx In itEx tensionModu le 函数,必须检查该函数的返回值,如果返回0,DLLMmain 也返回0;4、如果它希望输出CRuntimeClass 类型的对象或者资源,则需要提供一个初始化函数来创建一个CDy nLinkLibrary对象。
并且,有必要把初始化函数输出;5、使用扩展DLL 的MFC 应用程序必须有一个从CW inApp 派生的类,而且,一般在In it Instance 里调用扩展DLL 的初始化函数。
DLL入口函数1、每一个DLL 必须有一个入口点,DLLMain 是一个缺省的入口函数。
DLL Main 负责初始化和结束工作,每当一个新的进程或者该进程的新的线程访问DLL 时,或者访问DLL 的每一个进程或者线程不再使用DLL或者结束时,都会调用DLLMain。
但是,使用Term inateProcess 或T erm inateThread 结束进程或者线程,不会调用DLLMain。
DLLMain的函数原型:BOOL APIENTRY DLLMain(HANDLE hModule,DWORDul_reason_for_call,LPVOIDlpReserved){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:是一个说明动态库被调原因的标志。
当进程或线程装入或卸载动态连接库的时候,操作系统调用入口函数,并说明动态连接库被调用的原因。
它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用;DLL_THREAD_ATTACH: 线程被调用;DLL_PROCESS_DETACH: 进程被停止;DLL_THREAD_DETACH: 线程被停止;lpRes erv ed:是一个被系统所保留的参数;2、_DLLMainCRTStartup为了使用"C" 运行库(CRT,C Run time L ibrary) 的DLL 版本(多线程),一个DLL 应用程序必须指定_DLLMainCRTStartup 为入口函数,DLL 的初始化函数必须是DLLMain。