您的位置:首页 > 编程语言 > C语言/C++

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),选择好保存工程的路径-->确定.



在 应用程序设置 --> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)";



接下来点击"确定"进入项目工作窗口下.

——————————————————————————————————————————————

开始创建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指定按序号导;

项目截图:



第四步:

按 F5启动调试 或直接 菜单栏 --> 生成 -->生成 MakeDll(U),这如果提示生成成功那么在你保存工程的的路径下的"Debug"文件夹下即可找到生成成功的MakeDll.dll动态链接库文件



以上就是介绍用C语言创建简单的DLL方法,在VC++6下创建方式基本相同,接下来就一起来看如何用VB和Python来调用它.

——————————————————————————————————————————————

用VB调用:

首先新建VB工程,选择"标准EXE"

在对象窗口设计好我们的界面,一些标签,三个文本框和一个按钮,如图:



控件的名称我使用的是默认值,在代码窗口中的代码如下:

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


代码窗口处截图:



OK,完成,下面按"F5 "启动运行,输入正确格式的数值,点击 "比较" ,看下结果如何:



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成功!

——————————————————————————————————————————————

笔者:欢迎转载,转载请注明出处!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: