欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何打开dll文件代码(运行dll文件的方法)

程序员文章站 2024-03-27 14:34:04
python 项目中有时会兼顾执行效率和功能隐藏的需求,调用dll是个很好的选择。本文介绍一下python调用dll的方法,供大家参考。开发工具:visual studio 2017,pycharm开...

python 项目中有时会兼顾执行效率和功能隐藏的需求,调用dll是个很好的选择。本文介绍一下python调用dll的方法,供大家参考。

开发工具:visual studio 2017,pycharm

开发框架:c++ dll开发用mfc;pycharm python项目

本文主要内容:

  • c++编写dll的主要功能实现;
  • python 调用dll的实现方法;
  • python调用dll方法的总结。

1.c++编写dll接口

step1 创建mfc 动态链接库 应用程序

如何打开dll文件代码(运行dll文件的方法)

创建mfc 动态链接库 应用程序

step2 查看工程结构并编译生成dll 文件

如何打开dll文件代码(运行dll文件的方法)

查看工程结构并编译生成dll 文件

step3 添加接口函数并编译生成dll

添加接口函数,在cpp 文件中添加接口,形式如下,extern “c” __declspec(dllexport) +返回类型 +接口函数名称+(参数1,参数2 …)

//带参数和返回值的接口
extern"c" __declspec(dllexport) int add(int a, int b)
{
return a + b;
}
//带参数的接口
extern"c" __declspec(dllexport) void showtips(char* tips)
{
afxmessagebox(tips);
}
//对话框接口函数调用
extern"c" __declspec(dllexport) void testdialog(char* tips)
{
afx_manage_state(afxgetstaticmodulestate());
cdialoga* dlg = new cdialoga(null, tips);
dlg->domodal();
}

更多c++创建dll的方法可参考前面总结的c# 调用dll接口功能实现

2.python 调用dll

2.1加载dll

dllpath = "./dlltest.dll"
pdll=ctypes.windll(dllpath)
print (pdll)

如何打开dll文件代码(运行dll文件的方法)

加载dll

2.2 调用带参数和返回值的接口

如何打开dll文件代码(运行dll文件的方法)

调用add接口

2.3 调用带字符串参数的接口

#c++ 接口 原型:extern"c" __declspec(dllexport) void showtips(char* tips)
shpwtips = pdll.showtips
#设置输入参数类型
shpwtips.argtypes = [ctypes.pointer(ctypes.c_char)]
#传参 字符串需要转换
str1 = (ctypes.c_char * 256)(*bytes("hello python call dll!", 'mbcs'))
#调用函数
shpwtips(str1)

如何打开dll文件代码(运行dll文件的方法)

调用带字符串参数的接口

2.4 调用对话框接口并传参

#3 调用对话框接口
#extern"c" __declspec(dllexport) void testdialog(char* tips)
shpwdialog = pdll.testdialog
#设置输入参数类型
shpwdialog.argtypes = [ctypes.pointer(ctypes.c_char)]
#传参
str1 = (ctypes.c_char * 256)(*bytes("hello python call dll dialog!", 'mbcs'))
#调用函数
shpwdialog(str1)

如何打开dll文件代码(运行dll文件的方法)

调用对话框接口并传参

如何打开dll文件代码(运行dll文件的方法)

传入参数

如何打开dll文件代码(运行dll文件的方法)

调用显示dll对话框

3.总结

本文总结了python调用dll的最基本的实现方法,仅供参考。总结一下本文的要点:

1)实现python 调用带参数和返回值的接口

2)实现python调用带参数不带返回值的接口

3)实现python调用带参数的 对话框接口

4)功能实现需要在类接口中完成,python只负责调用,不负责实现;

5)接口函数如果带参数,需要设置argtypes 类型,参数个数和类型与实际值保持一致(shpwtips.argtypes = [ctypes.pointer(ctypes.c_char)]]);

6)调用接口之前,字符串参数本身也需要进行转换(str1 = (ctypes.c_char * 256)(*bytes(“hello python call dll dialog!”, ‘mbcs’))))

7)编码方式,如果c++ dll 是多字节 编码的,用’mbcs’ ;如果是unicode 编码的,用’utf-8′

更多扩展内容待总结。