C语言编写DLL动态链接库并分别用VB和Python调用
2012-02-22 00:59
651 查看
笔者所使用的编程环境是Visual Stdio 2010下的Visual C++、精简版Visual Basic 6.0、和IDLE,如有错误之处,欢迎批评指正!
以用C语言编写出一个求出两个数的较大值的DLL为例进行演示。
——————————————————————————————————————————————
首先打开VS 2010--> 新建工程 --> Win32 --> Win32项目 --> 输入一个自己喜欢的工程名称(笔者输入的是MakeDll),选择好保存工程的路径-->确定.
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844399aKD4.jpg)
在 应用程序设置 --> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)";
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844397XS1k.jpg)
接下来点击"确定"进入项目工作窗口下.
——————————————————————————————————————————————
开始创建DLL:
第一步:
在头"解决方案资源管理器" --> 头文件 --> 右键 -->添加新建项 -->选择"头文件(.h)" -->输入文件名称(笔者输入的是max) --> 添加(A)
max.h头文件中的代码为:
__declspec(dllexport) 的作用是指定导出该函数为DLL函数;
__stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用;
第二步:
在头"解决方案资源管理器" --> 源文件 --> 右键 -->添加新建项 -->选择"C++文件(.cpp)" -->输入文件名称(笔者输入的是max.c) --> 添加(A)
max.c源文件中的代码为:
在该源文件下我们将自己定义的头文件"max.h"包含进去,并且定义比较两数大小的函数fmax(),依然在此函数前声明该函数的调用为__stdcall类型;
第三步:
在头"解决方案资源管理器" --> 源文件 --> 右键 -->添加新建项 -->选择"模块定义文件(.def)" -->输入文件名称(笔者输入的是max.def) --> 添加(A)
max.def的作用是用于导出一个DLL的函数;
max.def模块文件中的代码为:
''LIBRARY''的作用是告诉链接器(linker)如何命名你的DLL,但它只是影响lib连接dll的名称的,而不是影响生成dll的名称;
EXPORTS 语句的作用是引入导出的函数或数据组成的节;
fmax @1指定按序号导;
项目截图:
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844397vnnD.jpg)
第四步:
按 F5启动调试 或直接 菜单栏 --> 生成 -->生成 MakeDll(U),这如果提示生成成功那么在你保存工程的的路径下的"Debug"文件夹下即可找到生成成功的MakeDll.dll动态链接库文件
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844398862M.jpg)
以上就是介绍用C语言创建简单的DLL方法,在VC++6下创建方式基本相同,接下来就一起来看如何用VB和Python来调用它.
——————————————————————————————————————————————
用VB调用:
首先新建VB工程,选择"标准EXE"
在对象窗口设计好我们的界面,一些标签,三个文本框和一个按钮,如图:
![](http://hi.csdn.net/attachment/201202/21/10254396_13298443989P0q.jpg)
控件的名称我使用的是默认值,在代码窗口中的代码如下:
代码窗口处截图:
![](http://hi.csdn.net/attachment/201202/21/10254396_13298443982KtF.jpg)
OK,完成,下面按"F5 "启动运行,输入正确格式的数值,点击 "比较" ,看下结果如何:
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844398zk5p.jpg)
Very well !VB调用成功.
——————————————————————————————————————————————
用Python调用:
在Python下调用DLL是十分简单的,Python有内置模块ctypes可帮助我们轻易完成这项工作.
打开IDLE--> File -->New Window,在代码窗口中敲入以下代码:
由于我们在编写DLL时对MakeDll.dll的调用约定为__stdcall,所以加载dll的方式应为:
ctypes.windll.LoadLibrary("dllpath")
或者
ctypes.WinDLL("dllpath")
接下来,保存、运行
运行结果:
OK,Python调用MakeDll.dll成功!
——————————————————————————————————————————————
笔者:欢迎转载,转载请注明出处!
以用C语言编写出一个求出两个数的较大值的DLL为例进行演示。
——————————————————————————————————————————————
首先打开VS 2010--> 新建工程 --> Win32 --> Win32项目 --> 输入一个自己喜欢的工程名称(笔者输入的是MakeDll),选择好保存工程的路径-->确定.
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844399aKD4.jpg)
在 应用程序设置 --> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)";
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844397XS1k.jpg)
接下来点击"确定"进入项目工作窗口下.
——————————————————————————————————————————————
开始创建DLL:
第一步:
在头"解决方案资源管理器" --> 头文件 --> 右键 -->添加新建项 -->选择"头文件(.h)" -->输入文件名称(笔者输入的是max) --> 添加(A)
max.h头文件中的代码为:
#ifndef _MAX_H #define _MAX_H_ __declspec(dllexport) int __stdcall fmax(int a,int b); #endif
__declspec(dllexport) 的作用是指定导出该函数为DLL函数;
__stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用;
第二步:
在头"解决方案资源管理器" --> 源文件 --> 右键 -->添加新建项 -->选择"C++文件(.cpp)" -->输入文件名称(笔者输入的是max.c) --> 添加(A)
max.c源文件中的代码为:
#include"max.h" int __stdcall fmax(int a,int b) { return a>b?a:b; }
在该源文件下我们将自己定义的头文件"max.h"包含进去,并且定义比较两数大小的函数fmax(),依然在此函数前声明该函数的调用为__stdcall类型;
第三步:
在头"解决方案资源管理器" --> 源文件 --> 右键 -->添加新建项 -->选择"模块定义文件(.def)" -->输入文件名称(笔者输入的是max.def) --> 添加(A)
max.def的作用是用于导出一个DLL的函数;
max.def模块文件中的代码为:
LIBRARY MakeDll EXPORTS fmax @1
''LIBRARY''的作用是告诉链接器(linker)如何命名你的DLL,但它只是影响lib连接dll的名称的,而不是影响生成dll的名称;
EXPORTS 语句的作用是引入导出的函数或数据组成的节;
fmax @1指定按序号导;
项目截图:
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844397vnnD.jpg)
第四步:
按 F5启动调试 或直接 菜单栏 --> 生成 -->生成 MakeDll(U),这如果提示生成成功那么在你保存工程的的路径下的"Debug"文件夹下即可找到生成成功的MakeDll.dll动态链接库文件
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844398862M.jpg)
以上就是介绍用C语言创建简单的DLL方法,在VC++6下创建方式基本相同,接下来就一起来看如何用VB和Python来调用它.
——————————————————————————————————————————————
用VB调用:
首先新建VB工程,选择"标准EXE"
在对象窗口设计好我们的界面,一些标签,三个文本框和一个按钮,如图:
![](http://hi.csdn.net/attachment/201202/21/10254396_13298443989P0q.jpg)
控件的名称我使用的是默认值,在代码窗口中的代码如下:
Private Declare Function fmax Lib "D:\Develop\Project\VB\MakeDll\Debug\MakeDll.dll" _ (ByVal inta As Integer, ByVal intb As Integer) As Integer '声明DLL过程 Private Sub Command1_Click() Dim a As Integer, b As Integer a = Text1.Text b = Text2.Text Text3.Text = fmax(a, b) '调用MakeDll.dll End Sub
代码窗口处截图:
![](http://hi.csdn.net/attachment/201202/21/10254396_13298443982KtF.jpg)
OK,完成,下面按"F5 "启动运行,输入正确格式的数值,点击 "比较" ,看下结果如何:
![](http://hi.csdn.net/attachment/201202/21/10254396_1329844398zk5p.jpg)
Very well !VB调用成功.
——————————————————————————————————————————————
用Python调用:
在Python下调用DLL是十分简单的,Python有内置模块ctypes可帮助我们轻易完成这项工作.
打开IDLE--> File -->New Window,在代码窗口中敲入以下代码:
#!/user/bin/python # _*_ coding: cp936 _*_ import ctypes mydll=ctypes.windll.LoadLibrary("D:\Develop\Project\VB\MakeDll\Debug\MakeDll.dll") a=17 b=25 print "较大数为:",mydll.fmax(a,b)
由于我们在编写DLL时对MakeDll.dll的调用约定为__stdcall,所以加载dll的方式应为:
ctypes.windll.LoadLibrary("dllpath")
或者
ctypes.WinDLL("dllpath")
接下来,保存、运行
运行结果:
IDLE 2.6.7 >>> ================================ RESTART ================================ >>> 较大数为: 25 >>>
OK,Python调用MakeDll.dll成功!
——————————————————————————————————————————————
笔者:欢迎转载,转载请注明出处!
相关文章推荐
- PB8调用使用C++与C#分别编写生成解压缩带有密码的zip压缩文件的动态链接库dll(部分内容转自互联网)
- Delphi调用C++编写的动态链接库dll的方法
- 用VB编写DLL动态链接库方法
- C# 调用GDAL编写的动态链接库dll,后不能将生成的图像显示到picturebox上,显示内存不足
- java 解决调用c语言实现简单HelloWorld函数生成.dll动态链接库的32位dll文件无法在64位机上运行
- windows下的动态链接问题(.dll文件的编写与调用)
- ctypes: 使用python调用C编写的动态链接库
- python 调用so dll动态链接库
- C语言调用DLL动态链接库出错
- Java调用C/C++编写的第三方dll动态链接库
- Java调用C/C++编写的第三方dll动态链接库
- Visual Studio下建立并隐式调用自己的动态链接库dll
- C#+.NET中调用VB编写的DLL代码事例
- 在vb,vc中调用vb编写的DLL
- C#调用本地动态链接库时,根据x86或x64自动选择相应的动态链接库dll文件
- 【转载整理】eclipse 开发c/c++、Java使用JNI调用C程序、生成64位dll动态链接库
- VS2015编写能够被vb\delphi等调用的dll
- 如何用c语言调用c++做成的动态链接库
- (一)Dll 动态链接 的 隐式调用(VS2010)
- DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用