
用于c#的DLL生成方法1: 打开vs2008,创建一个名为Cmdll(C ++. net语言)的新类库2: 在Cmdll.h中输入以下代码: extern“ C” __declspec(dllexport)int SampleMethod(int i){返回i * 10;} 3: 对其进行编译,将在项目文件夹中生成Cmdll.dll文件. 这可以在c#中调用. c#使用System进行如下调用;使用System.Runtime.InteropServices;名称空间ConsoleApplication1 {类程序{[DllImport(“ Cmdll.dll”,EntryPoint =“ SampleMethod”)]公共静态外部int SampleMethod(int x);静态void Main(字符串[] args){Console.WriteLine(“ SampleMethod()返回{0}. ”,SampleMethod(5)); Console.Read();}}} C ++ Dll简介I.前言自从Microsoft引入16位Windows操作以来,自该系统以来,Windows操作系统的每个版本都严重依赖于动态链接中的功能和数据. 库(DLL). 实际上,Windows操作系统中的几乎所有内容都由DLL以一种或另一种形式表示. 例如,显示的字体和图标存储在GDI DLL中,显示Windows桌面和处理用户输入所需的代码存储在User DLL中,并且Windows编程所需的大量API函数也包含在其中. 内核DLL.
在Windows操作系统中使用DLL具有许多优点. 要点是,多个应用程序,甚至是用不同语言编写的应用程序,都可以共享DLL文件,从而真正实现资源“共享”并大大减少了应用程序. 程序的执行代码可以更有效地利用内存. 使用DLL的另一个优点是DLL文件是具有良好封装和独立性的独立程序模块. 当需要升级软件时,开发人员只需要修改相应的DLL文件即可,并且当DLL中的功能发生更改时,只要它不是参数更改,就不需要重新编译程序代码. 这在编程时非常有用,大大提高了软件开发和维护的效率. 由于DLL非常重要,因此弄清DLL是什么以及如何在Windows操作系统中开发和使用DLL是程序开发人员必须解决的问题. 针对这些问题,本文使用一个简单的示例来实现两个简单的函数,这些函数比较DLL中的最大和最小整数,并全面分析在Visual C ++编译环境下编写DLL的过程. 代码在Windows98下传递系统和Visual C ++ 6.0编译环境. 其次,DLL的概念DLL是基于客户端/服务器通信的概念构建的,包含一个包含多个功能,类或资源的库文件,功能和数据存储在DLL(服务器)上并由一个或多个客户端导出以供使用这些客户端可以是应用程序或其他DLL.

DLL库与静态库不同. 对于静态库,函数和数据被编译成二进制文件(通常带有扩展名* .LIB). Visual C ++编译器将处理静态库中的程序代码. 恢复这些功能和数据,并将它们与应用程序中的其他模块组合在一起以生成可执行文件. 此过程称为“静态链接”. 此时,由于应用程序所需的所有内容都是从库中复制的,因此静态库本身不需要与可执行文件一起分发. 对于动态库,有两个文件,一个是导入库(.LIB)文件,另一个是DLL文件. 导入的库文件包含DLL导出的函数的名称和位置,并且DLL包含实际的函数和数据. 该程序使用LIB文件链接到需要使用的DLL文件. 库中的功能和数据不会复制到可执行文件中. 因此,在应用程序的可执行文件中,存储的功能代码不是被称为功能代码,而是DLL. 要调用的函数的内存地址,以便在运行一个或多个应用程序时,程序代码和被调用的函数代码链接在一起,从而节省了内存资源. 从上面的描述可以看出,DLL和.LIB文件必须随应用程序一起分发,否则应用程序将生成错误. Microsoft的Visual C ++支持三个DLL,分别是Non-MFC DLL(非MFC动态库)Regular Dll Regular DLL)Extension Dll Extension DLL)Non-MFC DLL,(,,(.
是指直接用C语言编写的,没有MFC类库结构的DLL. 导出的函数是标准的C接口,可由MFC或MFC以外的应用程序调用. 常规DLL: 类似于下面描述的Extension Dlls,它是用MFC类库编写的. 它的一个明显特征是在源文件中有一个继承CWinApp的类(注意: 尽管这种DLL派生自CWinApp,没有新闻循环),导出的函数是C函数怎么写dll文件,C ++类或C ++成员函数(请注意不要将术语C ++类与MFC Microsoft基本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函数添加初始化代码和结束代码. 三,创建动态链接库在Visual C ++ 6.0开发环境中,打开“文件\新建\项目”选项,可以选择Win32动态链接库或MFC AppWizard [dll]以不同的方式创建Non-MFC DLL. ,不同类型的动态链接库,例如Regular Dll和Extension Dll. 1. Win32动态链接库创建非MFC DLL动态链接库的方式每个DLL必须有一个入口点,就像我们用C语言编写的应用程序一样,必须有一个WINMAIN函数. DllMain是Non-MFC DLL中的默认输入函数. 您无需编写自己的DLL入口函数. 使用此默认条目功能将使动态链接库在调用时正确初始化.
如果应用程序的DLL需要分配额外的内存或资源,或者需要初始化和清除每个进程或线程,则相应DLL项目的.CPP文件中的DllMain()函数应如下所示. BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)(开关(ul_reason_for_call)){case DLL_PROCESS_ATTACH: .......案例DLL_THREAD_ATTACH: .......案例DLL_THREAD_DETACH: .......案例DLL_PROCESS_DETACH: .......}返回TRUE;}在参数中,hMoudle是在调用动态库时指向自身的句柄(实际上,它是指向_DGROUP节的选择器); ul_reason_for_call解释调用动态库的原因的符号. 当进程或线程加载或卸载动态链接库时,操作系统将调用入口函数并解释动态链接库的原因. 所有可能的值都是: DLL_PROCESS_ATTACH: 调用进程,DLL_THREAD_ATTACH: 调用线程,DLL_PROCESS_DETACH: 进程停止,DLL_THREAD_DETACH: 线程停止; lpReserved是保留参数.

至此,DLL的入口函数已经编写完毕,其余的实现并不困难. 您可以在DLL项目中添加要输出的函数或变量. 我们已经知道DLL是一个包含多个功能的库文件. 在应用程序使用DLL中的功能之前,应首先导出这些功能供应用程序使用. 有两种导出这些功能的方法. 一种是在定义函数时使用导出关键字_declspec(dllexport),另一种是在创建DLL文件时使用模块定义文件.Def. 读者应注意,使用第一种方法时,不能使用DEF文件. 下面的两个示例说明如何使用这两种方法来创建DLL文件. 1)使用导出功能关键字_declspec(dllexport)创建MyDll.dll. 动态链接库中有两个函数,用于实现两个数字的最大值和最小值. 在MyDll.h和MyDLL.cpp文件中输入以下原始代码: //MyDLL.h extern“ C” _declspec(dllexport)int Max(int a,int b); extern“ C” _declspec(dllexport)int Min(int a,int b); //MyDll.cpp #include #include“ MyDll.h” int Max(int a,int b){if(a> = b)返回a;否则返回b;} int Min(int a,int b){if(a> = b)返回b;否则返回a;}成功编译动态链接库后,打开MyDll项目中的调试目录,您可以看到两个文件MyDll.dll和MyDll.lib.
LIB文件包含DLL文件的名称和DLL文件中的函数名称. LIB文件仅对应于DLL文件的“图像文件”. 在DLL文件中,LIB文件的长度要小得多,这是隐式的. 在链接DLL时使用. 读者可能已经注意到MyDll.h中有关键字``extern C'',它允许其他编程语言访问您编写的DLL中的功能. 2)使用.def文件创建项目MyDll为了使用.def文件创建DLL,请在上一个示例中创建的项目中删除MyDll.h文件,保留MyDll.cpp并删除#include MyDll. 在文件头中的h语句中,同时,将一个文本文件添加到项目中,名为MyDll.def,然后将以下代码添加到文件中: LIBRARY MyDll //注意,这里的MyDll是项目名称. 如果应用程序不同,则当应用程序连接到库EXPORTS Max @ 1,Min @ 2时,将发生连接错误,其中LIBRARY语句指示def文件属于相应的DLL,并且要导出的函数名已被导出. 在EXPORTS语句下列出. 我们可以在.def文件中的导出函数之后添加@n,例如Max @ 1,Min @ 2,以指示要导出的函数的序列号,可以在执行显式连接时使用.

成功编译DLL之后,打开项目中的Debug目录,您还将看到MyDll.dll和MyDll.lib文件. 2. MFC AppWizard [dll]生成常规/扩展DLL的方式MFC AppWizard [dll]下有三种生成DLL文件的方式. 创建DLL时,需要根据实际情况选择创建DLL的方式. 一种是常规DLL静态链接到MFC,另一种是常规DLL动态链接到MFC. 两者的区别是: 前者使用MFC的静态链接库,生成的DLL文件长度大,一般不使用此方法,后者使用MFC的动态链接库,生成的DLL文件长度小;动态链接到MFC所有DLL输出函数的规则应从以下语句开始: AFX_MANAGE_STATE(AfxGetStaticModuleState())//此语句用于正确切换MFC模块的状态. 最后一种类型是MFC扩展DLL. 此DLL功能用于建立MFC派生类,Dll仅由用MFC类库编写的应用程序调用. 正如我们已经提到的,扩展DLL与常规DLL不同. 它没有继承自CWinApp的类的对象. 编译器默认使用DLL入口函数DLLMain()作为DLL的初始化. 您可以使用此函数来实现初始化,代码如下: BOOL WINAPI APIENTRY DLLMain(HINSTANCE hinstDll,DWORD原因,LPVOID flmpload){switch(原因){……………//初始化代码;}返回true;}参数hinstDll存储DLL的句柄,参数reason指定调用该函数的原因,lpReserved是系统保留的参数.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-215786-1.html
从哪里结束