1.要用到的C++动态库工程
ArrayTool.h
#ifndef ARRAY_TOOL_H
#define ARRAY_TOOL_H
#ifdef MYLIBRARY_EXPORTS
#define MYLIBRARY_API __declspec(dllexport) // 导出符号
#else
#define MYLIBRARY_API __declspec(dllimport) // 导入符号
#endif
// 声明一个导出函数
extern "C" MYLIBRARY_API int MaxNum(int first_num, int second_num);
#endif // !ARRAY_TOOL_H
ArrayTool.cpp
#define MYLIBRARY_EXPORTS // 为了让导出符号有效,所以才需要定义这个宏
#include "ArrayTool.h"
// 返回 first_num 和 second_num 中的最大值
int MaxNum(int first_num, int second_num)
{
return first_num > second_num ? first_num : second_num;
}
2.python工程目录
2.将所要用到的C++动态库放在python项目目录下,如下图:
PyCharm会自动加载C++动态库:
3.编写python代码:main.py
import ctypes, ctypes.util # ctypes 是 Python 的内置库,主要用于在 Python 中调用动态链接库
# 查找动态库
def find_dll(dll_name):
return ctypes.util.find_library(dll_name) # 查找DLL
# 加载动态库
def load_dll(dll_path):
try:
vc_dll = ctypes.CDLL(dll_path) # 加载动态库,若失败抛出异常
vc_func = vc_dll.MaxNum # 取动态库的函数
max_num = vc_func(0,3) # 调用动态库函数
print("max_num:"+str(max_num))
except OSError as e:
print(e, "加载DLL失败")
# 主函数入口
if __name__ == "__main__":
dll_path = find_dll("DLLDemo.dll")
if dll_path:
load_dll(dll_path)
else:
print("动态库路径不对")
4.执行python程序时会报错:[WinError 193] %1 不是有效的 Win32 应用程序。
原因如下图所示,因为此时我们用的动态库是32位的,但是python是64位的:
解决方法如下图所示,将动态库改成64位即可: