C++创建调用DLL文件

合集下载

VC编写DLL几种方法的简介+

VC编写DLL几种方法的简介+

动态连接库最大的特点就是能节省磁盘空间.当多个进程共享同一个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]在客户端要加上导入语句就可以了.。

使用CLion创建C语言动态链接库DLL文件

使用CLion创建C语言动态链接库DLL文件
运行之前需要添加环境变量。
参考
准备
配置编译环境MinGW,类似配置IDEA的jdk
配置构建环境Cmake
调试结果如下
创 建 DLL项 目
项目名称为testdll
项 目 stdll.dll
创 建 DLL使 用 项 目
使用C语言调用dll
在项目下创建lib目录,将之前生成的libtestdll.dll文件放到此目录下,设置lib搜索目录。
其实短链接只有生成和跳转还不能满足实际业务需求还需要考虑其使用场景目前短链接使用场景主要是短信内带短链接
使用 CLion创建 C语言动态链接库 DLL文件
前言
CLion是JetBrains公司一款开发C和C++的强大IDE,其公司产品还有IntelliJ IDEA,WebStorm,Pycharm等。 MinGW 的全称是:Minimalist GNU on Windows,可以看做 GCC 的 Windows 版本。 DLL 的全称为 Dynamic Link Library,动态链接库,类似java中的jar包,达到代码复用的优势。

C#创建dll和调用dll

C#创建dll和调用dll

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环境下)

C语言创建动态dll和调用dll(visualstudio2013环境下)

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⽂件都可以使⽤此⽅式解决以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

VC6.0中,创建、调用 dll

VC6.0中,创建、调用 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()就可以了。

CBuilder建立及调用DLL.

CBuilder建立及调用DLL.

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方法

总结的c#调用DLL方法
The MaxCD of 456 and 123 is 3
小结:
动态链接具有下列优点:
节省内存和减少交换操作。很多进程可以同时使用一个DLL,在内存中共享该DLL的一个副本。相反,对于每个用静态链接库生成的应用程序,Windows必须在内存中加载库代码的一个副本。
节省磁盘空间。许多应用程序可在磁盘上共享DLL的一个副本。相反,每个用静态链接库生成的应用程序均具有作为单独的副本链接到其可执行图像中的库代码。
long maxcd = MaxCDClass.MaxCD(num1,num2);
Console.WriteLine("The MaxCD of {0} and {1} is {2}",num1, num2, maxcd);
}
}
若要生成可执行文件MyClient.exe,请使用以下命令行:
csc /out:MyClient.exe /reference:MyLibrary.DLL MyClient.cs
升级到DLL更为容易。DLL中的函数更改时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。相反,静态链接的对象代码要求在函数更改时重新链接应用程序。
提供售后支持。例如,可修改显示器驱动程序DLL以支持当初交付应用程序时不可用的显示器。
支持多语言程序。只要程序遵循函数的调用约定,用不同编程语言编写的程序就可以调用相同的DLL函数。程序与DLL函数在下列方面必须是兼容的:函数期望其参数被推送到堆栈上的顺序,是函数还是应用程序负责清理堆栈,以及寄存器中是否传递了任何参数。
}
(3)在CS编辑器中再次添加一个CS文件,名字自取,但包函main入口函数,在这个文件中便可以引用C++写的DLL文件中的函数了

C#下开发及调用dll文件的方法

C#下开发及调用dll文件的方法

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文件就是一个一个封装好的类库而已。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++ 创建和调用动态链接库 DLL 文件(64 位)
操作系统:windows 所用编辑环境:VS2013 方法如下: 一、创建链接库文件 目标:vs2013 生成一个 64 位的.dll 文件 1 创建 win32 控制台程序空项目,设置时选择 DLL 选项
2 创建完成后,编写带吗,并设置 64 位。
FreeLibrary(hdll); cout << "失败" << endl; return 0; } sum1= (f if (sum1 == NULL) { FreeLibrary(hdll); return 0; } cout << sum1(1,2) << endl;
代码: extern "C"_declspec(dllexport) int sum(int a, int b); int sum(int a, int b) {
return a + b; } 3 生成.dll 文件,点击生成——>生成 DLL
在 X64 文件夹中看到 DLL 文件。 二、64 位程序调用 64 位 DLL,和普通控制台程序方法一样,多了一个设置成 64 位的步骤。 1 创建控制台程序。 2 编写代码,设置 64 位程序,方法同上面。
FreeLibrary(hdll);
}
3 右键项目 属性——>常规——>字符集设置为 “使用多字节字符集”
运行即可。
注: 1、在写 DLL 代码时: (1)extern "C":用 C 编译方式编译,目的是不重载。 (2)_declspec(dllexport):供外部调用 2、在写主函数时: (1)LoadLibrary():根据文件路径获取模块的句柄。 (2)(f)GetProcAddress():根据函数名获取函数指针(也是为何用 C 编译的原因)
代码如下: #include<iostream> #include<Windows.h>
typedef int(*f)(int , int); using namespace std; int main() {
f sum1; HINSTANCE hdll; hdll = LoadLibrary("E:\\研一\\项目\\testDLL\\x64\\Debug\\testDLL.dll"); if (hdll == NULL) {
相关文档
最新文档