9、选择release方式build CppDll项目,在release文件夹中生成了CppDll.dll文件,可以看到同时其也将引用的CSharpDll.dll也给拷贝到release文件夹中了。

10、接下来在Qt中进行调用, 在QtCreator中新建一个TestCSharpDll GUI项目,编译器选的mingw。通过VS自带的命令行工具中的dumpbin工具可以查看CppDll.dll导出的函数接口。
dumpbin -exports (+dll路径)

在TestCSharpDll工程中通过typedef定义函数指针,同时采用QLibrary动态加载并resolve函数。
在这里.dll的路径设为当前目录下“./CppDllMingW.dll”,也就是编译好的程序exe同一目录下的dll,去resolve由普通导出方式的接口即“?add@@YAHHH@Z”。
主要代码如下所示:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QLibrary>
#include<QMessageBox>
typedef int (*x_add)(int a , int b);
typedef void (*x_substract)(int a , int b , int* c);
typedef void (*x_showBox)(const char* content);
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//add
void MainWindow::on_pushButton_clicked()
{
int a = ui->lineEdit->text().toInt();
int b = ui->lineEdit_2->text().toInt();
QLibrary library("./CppDll.dll");
if(library.load()){
x_add add = (x_add)library.resolve("?add@@YAHHH@Z");
if(add){
QString str = QString::number(add(a , b));
QMessageBox::information(this , "call add from dll" , str);
}
}
}
//sub
void MainWindow::on_pushButton_2_clicked()
{
int a = ui->lineEdit_3->text().toInt();
int b = ui->lineEdit_4->text().toInt();
int c = 0;
QLibrary library("./CppDll.dll");
if(library.load()){
x_substract sub = (x_substract)library.resolve("?substract@@YAXHHPAH@Z");
if(sub){
sub(a , b , &c);
QString str = QString::number(c);
QMessageBox::information(this , "call sub from dll" , str);
}
}
}
//showBox
void MainWindow::on_pushButton_3_clicked()
{
QLibrary library("./CppDll.dll");
if(library.load()){
x_showBox showBox = (x_showBox)library.resolve("?showBox@@YAXPBD@Z");
if(showBox){
showBox("showBox!");
}
}
}
编译TestCSharpDll工程,将CppDll.dll和CSharpDll.dll复制到同一目录下,执行TestCSharpDll.exe,可看出点击按钮后,通过QLibrary进行动态resolve,均正常调用。












