C++创建调用DLL文件
- 格式:pdf
- 大小:333.95 KB
- 文档页数:4
动态连接库最大的特点就是能节省磁盘空间.当多个进程共享同一个DLL的时候,内存中只有一个DLL的代码.通过映射来使各个进程得以调用.1.用VC建立一个WIN32 DLL我们利用VC编写DLL有几种方法.如果用VC建立一个WIN32 DLL 工程.那这个工程就应该只导出C++的类或全局变量.和全局函数.方法就是在CPP文件中编写你的代码,为每个需要导出的元素进行导出办法是增加如下语句:_declspec(dllexport)你当然可以把它定义成宏例如,如果是一个类STUDENT需要导出, 那么声明时应该是这样写class _declspec{dllexport) student;当然也可以定义时直接导出.我们的客户端,也就是我们调用该函数的客户程序,就需要导入这个类或者函数..填写如下语句:class _declspec(dllimport) student{} // 声明之后就可以利用STUDENT来构造对象,也可以调用它的成员函数..了记住,一定要把工程的连接设置好.要把生成的LIB文件填写好,因为客户程序要想加载DLL,能够准确的调用各个DLL中的函数,都是靠这个LIB文件哪.包括函数的地址等等.当然也可以显示连接利用LOADLIBRARY原型是HMODULE LoadLibrary( LPCTSTR );返回的HMODULE就是一个DLL句柄.所以我们在利用这个句柄来作为参数调用另一个函数GETPROCADDRESSFARPROC GetProcAddress( HMODULE , LPCSTR); //如果利用序号来索引,那么要加上MAKEINTERSOURCE宏返回一个函数指针,利用它来调用函数,LPCSTR是函数名,但你应该利用DUMPBIN来查看一下你导出的函数名,因为C++编译器支持重载,它会以自己的方式重命名.除非你用extern \"C\"用C语言的方式来命名函数.例如一个函数void fun();导出格式应该是extern \"C\" _declspec(dllexport) void fun(); //如果是声明导入函数,直接写原型,如果是声明类,那么一定要是类的头文件声明,包含了成员函数和数据成员的.注意即使是采用了C语言命名方式如果你改变了调用方式_stdcall 那么还是会改变函数命名的,除非你利用DEF文件来导出.EXPORTSfun这样是可以的.2.建立一个MFC扩展DLL扩展DLL是为了更好的支持MFC的类.你建立这个工程后会自动生成一些代码,不要管它先,你把你要动态连接的CPP和相应的.H文件加入到工程,在.CPP文件中需要导出的类上加上AFX_EXT_Class 在.H需要导入的类上加上同样的代码,这样就可以了.例如class AFX_EXT_CLASS CSTUDENT : public CPERSON //.CPP{}class AFX_EXT_CLASS CSTUDENT ; //.H{} //声明3.建立一个常规的DLL如果你要建立扩展的DLL,那么其他的IDE是无法利用的,因为每个编译器的命名方式是不同的.如果你想使其他IDE来调用VC的DLL,那么就建立一个常规的DLL.建立工程以后,编写你要导出的类.例如extern \"C\" _declspec(dllexport) void fun(){AFX_MANAGE_STA TE(AfxGetStaticModuleState( ));}在为每一个需要导出的函数的开头加上这条语句. [Page]在客户端要加上导入语句就可以了.。
1. 新建一个类库。
2. 22、3. 33、编写一个简单的类库实例,例如:DllTest在默认名为:calss1.cs里编写代码一下是一个简单的:在控制台显示“你以成功调用了动态连接!”sing System;using System.Collections.Generic;using System.Text;namespace DllTest{public class Class1{public void ShowMessage(){Console.WriteLine("你以成功调用了动态连接!");Console.ReadLine();}}}4. 44、配置输出,在解决方案上右击——属性,在应用程序选卡中需要注意一下三个内容。
1.程序集名称2.默认命名空间3.输出类型1.DllTest2.DllTest3.类库这些对我调用来说很有用!5. 55、生成dll,在菜单栏在生成里点击“生成dlltest”,或者按shfit+F6 生成成功,在目录下能看到生成的Dll:6. 66、调用该dll,新建一个控制台应用程序,来实现该dll的调用。
新建一个DLLExample。
7.77、在新建的项目内添加引用,引用该dll。
8.88、9.99、在“查找范围里找到,我们生成的dll,点击确定。
在解决方案中显示如下内容,说明你添加成功!10.10 10、11.11 11、这时我就可以在程序中调用了。
在program.cs中添加如下代码:using System;using System.Collections.Generic;using System.Text;//必须添加using System.Runtime.InteropServices; using DllTest;namespace DllExample{class Program{//DllTest,我们的动态链接库[DllImport("DllTest.dll")]//public static extern void ShowMessage(); static void Main(string[] args){//实例化DllTest.Class1 i = new Class1();//调用动态链接库的方法i.ShowMessage();}}}12.12 12、运行结果:。
C语⾔创建动态dll和调⽤dll(visualstudio2013环境下)第⼀部分:创建动态dll库。
1、打开visual studio 创建⼀个控制台应⽤程序。
2、选择DLL,空项⽬。
3、点击源⽂件,创建⼀个main.c⽂件4、在main.c中写⼊⼀个简单的函数,内容如下:__declspec(dllexport)int mymax(int a,int b){return a + b;}5、编译⽣成。
6、在项⽬的⽬录有dll和lib两个⽣成好的⽂件。
第⼆部分:在新建项⽬中使⽤dll。
7、新建⼀个c的控制台应⽤程序UseDll,把Dll.dll放⼊Debug⽬录下。
8、把Dll.lib放⼊UserDll⽬录下。
9、在UseDll项⽬中新建⼀个源⽂件use.c,代码如下:#include<stdio.h>#pragma comment(lib,"Dll.lib")int mymax(int a,int b);int main(){printf("调⽤动态dll函数的结果:%d",mymax(5,6));getchar();return 0;}10、运⾏结果如下PS:vs2013调试程序时出现“计算机丢失.dll⽂件”在VS环境下能够编译成功,但是在运⾏.exe⽂件时,出现“计算机丢失xxx.dll⽂件”的提⽰的解决⽅式。
发⽣这种问题的根本原因在于环境变量的设置上,计算机只会在path下包含的⽬录⾥去寻找程序所要运⾏的.dll⽂件,若我们所要使⽤到的.dll⽂件没有包含在环境变量path中,则会发⽣错误:计算机丢失xxx.dll⽂件。
⼯具/原料1. VS2013或者其他版本2. VTK库或者其他库⽅法/步骤这⾥以丢失vtkIOPLY-7.0-gd.dll⽂件为例(主要是关于PCL1.8.0),找到VTK的安装⽬录下的bin⽂件夹(包含vtkIOPLY-7.0-gd.dll),我的bin⽂件夹是在C:\Program Files (x86)\PCL1.8.0\3rdParty\VTK\bin将上述⽬录添加到环境变量Path中,如下图所⽰重新开启项⽬,重新⽣成解决⽅案,则问题就会解决注意事项这⾥不仅仅是针对vtkIOPLY-7.0-gd.dll⽂件,任何丢失.dll⽂件都可以使⽤此⽅式解决以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
[动态链接库英文为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()就可以了。
C++Builder建立及调用DLLDLL简称动态链接库,是Windows中程序的重要组成部分。
想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程序分为好几个模块,团队每一个成员开发一个模块。
问题来了:如何将模块组合并成一个完整系统?还有,我们开发的软件需要不断升级,如何升级?难道每次非得把整个工程重新编译一次再发布给用户吗?解决这些问题的科学办法,就是开发动态链接库DLL。
现在以开发myDLL.dll动态链接库为例,讲讲BCB中开发动态链接库的方法。
1、新建立一个工程:File-New-Other...在New卡中选择DLL Wizard2、将工程存为myDLL.bpr3、在myDLL.cpp中写接口代码:////---------------------------------------------------------------------------#include <vcl.h>#include <windows.h>#pragma hdrstop////---------------------------------------------------------------------------//// Important note about DLL memory management when your DLL uses the//// static version of the RunTime Library://////// If your DLL exports any functions that pass String objects (or structs///// classes containing nested Strings) as parameter or function results,//// you will need to add the library MEMMGR.LIB to both the DLL project and//// any other projects that use the DLL. You will also need to use MEMMGR.LIB//// if any other projects which use the DLL will be performing new or delete//// operations on any non-TObject-derived classes which are exported from the//// DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling//// EXE's to use the BORLNDMM.DLL as their memory manager. In these cases,//// the file BORLNDMM.DLL should be deployed along with your DLL. //////// To avoid using BORLNDMM.DLL, pass string information using "char*" or//// ShortString parameters.//////// If your DLL uses the dynamic version of the RTL, you do not need to//// explicitly add MEMMGR.LIB as this will be done implicitly for you////---------------------------------------------------------------------------extern "C" __declspec(dllexport) __stdcall int myAdd(int,int);extern "C" __declspec(dllexport) __stdcall AnsiString aboutMe(void); int add(int n1,int n2);#pragma argsusedint WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved){return 1;}////---------------------------------------------------------------------------__declspec(dllexport) __stdcall int myAdd(int n1,int n2){int T;T=add(n1,n2);return T;}int add(int n1,int n2){return n1+n2;}__declspec(dllexport) __stdcall AnsiString aboutMe(void){return "曾棕根好你个大笨蛋,居然现在才学会用DLL!半年前施勇强就告诉了你呀!研究进度太慢!";}4、需要注意的是,在编写DLL这样的程序时,要力求简单,少用大量内存分配,尽量按照标准C的程序设计方法,以模块化结构设计为好,少采用面向对象的程序设计方法。
C#下开发及调用dll文件的方法在.net中,可调用的dll(动态链接库)文件其实就是一个类库。
我们可以通过写一个类,然后把它编译成dll文件形式,在其他的项目中就可以直接调用此编译好的dll文件,而不用重复写这个类的代码。
下面详细介绍此过程:一、开发dll文件(1)打开vs2005,新建项目中模板选择“类库”(2)在解决资源管理器里面添加一文件夹“First”,在其中添加两个类MathAdd和MathMinus,在其父目录里直接添加一个名为yun(写这个类的时候,我已经晕了,不知道取什么名字好,于是就yun了)的类。
下面是各个类的代码,注意类前一定要加上public,不然这个类会被当做是私有的,不能够被引用,当初我就是犯了这个错误,弄个了好久才想起,真是追悔莫及啊。
类中的方法为静态或非静态都可以。
MathAdd类代码using System;using System.Collections.Generic;using System.Text;namespace noo.First{public class MathAdd{public int add( int a,int b){return a + b;}public static int Muti(int a, int b){int mutiSum;mutiSum = a * b;return mutiSum;}}}MathMinus类代码using System;using System.Collections.Generic;using System.Text;namespace noo.First{public class MathMinus{public static int minus(int a, int b){return a - b;}}}yun类代码using System;using System.Collections.Generic;using System.Text;namespace noo{public class yun{public int add(int a, int b,int c){return a + b-c;}}到此,dll代码其实已经写好,这里我们可以发现,其实dll文件就是一个一个封装好的类库而已。
C静态库(lib)及动态库(dll)的创建及调用一、静态库的创建及调用最近在编程序的时候,用到静态库和动态库的创建和调用,将自己的一些心得总结如下,希望对各位有所帮助,有不恰当之处欢迎评论留言。
静态库和动态库的区别可以参考博客:windows中静态库lib和动态dll的区别及使用方法_dxzysk的专栏-CSDN博客_动态dll和静态库的区别1、静态库的创建为了方便大家学习,从空项目进行演示,实现输入两个数求出两数之和及两数之差,本文使用VS2017编译器。
(1)创建空项目(2)新建头文件.h和源文件.cpp其中test工程为后面测试用工程,现在不用考虑。
(3)修改项目属性,将目标文件扩展名和配置类型均修改为.lib (4)在项目头文件testLib.h中编写代码方法一和方法二均可以生成和调用(5)源文件testLib.cpp代码编写(6)工程生成可以看到工程目录下生成了testLib.ib和testLib.pdb文件,代表静态库生成成功。
2、静态库的调用(1)为了方便演示,在静态库生成的同解决方案下创建测试工程test,本地创建的是控制台应用程序。
(2)创建完测试工程后,在test.cpp文件中编写静态库调用程序(3)将test工程设置为启动工程,编译运行,会出现报错(4)针对(3)出现的报错,需要在项目中引入静态库文件路径静态库生成工程和测试工程目录如下:引入静态库的相对路径再次编译就可以成功。
运行结果如下至此,静态库的创建及调用讲解结束。
二、动态库的创建及调用1、动态库的创建动态库的创建介绍两种方式:__declspec(dllexport)和.def文件导出。
1.1、动态库的创建(__declspec(dllexport))(1)同静态库一样创建空项目testDll,创建头文件和源文件(2)修改项目属性,将目标文件扩展名和配置类型均修改为.dll(3)修改项目头文件testDll.h,本文介绍三种dll库生成的方法动态生成库的关键字为__declspec(dllexport)方法一和方法二的区别就是标识符是否被定义,如果标识符TESTDLL被定义则重新定义标识符TESTDLLAPI,并使用重新定义的标识符进行函数导出;如果标识符TESTDLL未被定义,则使用当前定义的标识符进行函数导出。
一、编写Dll文档1.新建一DLL项目dll2.#include"stdafx.h"#include"windows.h"#include"dll.h"#pragma comment(lib,"dll.lib")int _tmain(int argc, _TCHAR* argv[]){HelloWorld();return 0;}3.// dllmain.cpp : 定¡§义°? DLL 应®|用®?程¨¬序¨°的Ì?入¨?口¨²点Ì?。
¡ê#include"stdafx.h"#include"dll.h"#include<windows.h>#include<stdio.h>#include<stdlib.h>void HelloWorld (){MessageBox (0, L"Hello World from DLL!\n", L"Hi", MB_ICONINFORMATION);}BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,DWORD reason /* Reason this function is beingcalled. */ ,LPVOID reserved /* Not used. */ ){switch (reason){case DLL_PROCESS_ATTACH:break;case DLL_PROCESS_DETACH:break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;}/* Returns TRUE on success, FALSE on failure */return TRUE;}4.生成菜单下的重新生成解决方案,即得到dll和lib文件,如图:至此DLL文件建立完成。