项目创建
1、打开Visual Studio2013,选择Visual C++,接着选择Win32控制台应用程序
2、点击“下一步”,在win32应该程序向导中选择DLL(D),点击完成即可生成一个用来产生dll的工程
dll功能实现
初始工程
最初的工程如上图所示,下面需要添加相应的头文件(.h)和源文件(.cpp)
头文件和源文件创建
头文件和源文件的创建是类似的
1、选择文件添加
可以右键工程名,例如“pydll”,选择“添加”,继续选择“新建项”进入头/源文件创建界面
也可以右键文件夹,例如“头文件”,选择“添加”,继续选择“新建项”进入头/源文件创建界面
2、头/源文件创建
在“添加新项”的界面添加相关头文件和源文件
项目构建说明
接下来就是相关相关代码的实现,在展示代码之前先简单就框架中的各个文件的作用进行说明
我创建了两个头文件和一个源文件,其中“CallMath.h”和“CallMath.cpp”是声明了一个类,目前其中仅实现了一个“输出”的简单功能,用于实现读取类中函数的功能,另外实现的两个功能“传入数据进行相加”和“传入一维数组进行赋值”在pydll.cpp中实现
另一个头文件“PyInterface.h”是设置导出函数的相关代码
代码实现
CallMath.h
#pragma once
class CallMath {
public:
CallMath();
~CallMath();
void printStr();
};
CallMath.cpp
#include "CallMath.h"
#include <iostream>
using namespace std;
CallMath::CallMath() {
}
CallMath::~CallMath() {
}
void CallMath::printStr() {
cout << "Hello I am come from C++ World!";
}
PyInterface.h
其中涉及到一个宏定义,#define PYAPI _declspec(dllexport),这里面的“_declspec(dllexport)”是dll导出函数的必备条件,若要让函数能通过dll被调用,其需要放在函数返回值前面,表明这个函数是dll导出的函数(注:DLL导出函数和类是有区别的,这里暂时仅导出函数,导出类等后续博客更新的时候添加)
#include "CallMath.h"
#define PYAPI _declspec(dllexport)
extern "C"{
PYAPI void printStr();
PYAPI int add(int a, int b);
PYAPI int * show(int * c);
}
pydll.cpp
// pydll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "PyInterface.h"
#include <stdint.h>
#include <iostream>
using namespace std;
void printStr() {
CallMath callM;
callM.printStr();
}
int add(int a, int b) {
return a + b;
}
int * show(int * c) {
unsigned short *block_temp = new unsigned short[10 * 10 * 10];
for (int i = 0; i < 10*10*10; i++) {
block_temp[i] = 255+i;
}
for (int i = 0; i < 10 * 10 * 10; i++) {
c[i] = (int)block_temp[i];
}
return c;
}
dll生成
选择编译的环境,这里我选择的是Debug/x64,也可根据自己的需要设置不同的模式(注:编译环境的选取很重要,遇到“xxx不是有效程序”问题可能就是dll生成的版本不对)
在完成了相关代码的编写后,最后一步就是dll的生成:我们右键工程“pydll”,点击“生成”,当出现下面的结果则说明dll生成成功
最后可以在该项目的“\x64\Debug”中找到生成的dll和lib文件,例如我的路径就是“F:\Visual Studio 2013\Projects\pydll\x64\Debug”