C++动态库

4 篇文章 0 订阅

一.VS2015创建新的解决方案MyDll,选空项目。完成后,添加MyDll.h和MyDll.cpp两个文件

MyDll.h中代码:

#pragma once
#ifdef MYLIBAPI  
#else  
#define MYLIBAPI extern "C" __declspec(dllimport)  
#endif   
MYLIBAPI int g_nResult;


MYLIBAPI int Add(int a, int b);

修饰符 extern "C" 包含双重含义:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。而被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

  __declspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。

 extern "C" __declspec(dllexport)加起来的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做成的DLL。


MyDll.cpp中代码:

#include <Windows.h>  


#define MYLIBAPI extern "C" __declspec(dllexport)  


#include "MyDll.h"  


int g_nResult;


int Add(int a, int b)
{
g_nResult = a + b;


return g_nResult;
}

按Ctrl + Shift + B生成解放方案


二.使用Dll

(1)隐私链接

解决方案MyDll添加一个控制台运用程序项目CallTest,选空项目,完成后,添加CallTest.cpp文件,在CallTest.cpp文件同一个目录拷贝MyDll.h,MyDll.dll,MyDll.lib三个文件。然后选择菜单栏的“项目”->CallDll属性->链接器->输入->附近依赖项添加Mydll.dll;设置CallTest为启动项目.如图:


CallTest.cpp添加代码:

#include <iostream>  
#include <Windows.h>  
#include "MyDll.h"  


using namespace std;


int main()
{
cout << Add(1, 2) << endl;


system("pause");
return 0;
}


(2)显示调用

新建新的Win32控制台运用程序,选空项目,添加MyDll2.cpp文件,拷贝Mydll.dll放在MyDll2.cpp目录中。添加代码:

#include <iostream>  
#include <stdio.h>  
#include <string>  
#include <Windows.h>  
using namespace std;


typedef int(*DLLFUNC) (int, int);


int main()
{
DLLFUNC dllfunc;
bool fRunTimeLinkSuccess = false;


HINSTANCE hInstLib = LoadLibrary(TEXT("MyDll.dll"));
if (NULL != hInstLib)
{
dllfunc = (DLLFUNC)GetProcAddress(hInstLib, "Add");
if (NULL != dllfunc)
{
fRunTimeLinkSuccess = true;
cout << dllfunc(1, 2) << endl;
}
FreeLibrary(hInstLib);
}
if (!fRunTimeLinkSuccess)
{
cout << "Message printed from executable" << endl;
}


system("pause");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML可以使用C++动态来实现更复杂的功能。通过在QML中调用C++动态,我们可以利用C++的强大功能来处理一些复杂的逻辑和计算。下面是一个示例,演示了如何在QML中使用C++动态。 首先,在C++中创建一个类,该类将被注册到QML中。这个类可以包含一些函数和属性,供QML调用和访问。在这个例子中,我们创建了一个名为ColorMaker的类,它有一个函数用于生成随机颜色。 main.cpp文件中的代码如下[^1]: ```cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include "colormaker.h" int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; // 创建ColorMaker对象并注册到QML中 ColorMaker colorMaker; engine.rootContext()->setContextProperty("colorMaker", &colorMaker); const QUrl url(QStringLiteral("qrc:/main.qml")); engine.load(url); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); } ``` 接下来,我们需要在QML中调用这个C++类。在QML中,我们可以使用`Qt.createQmlObject()`函数来创建一个C++对象,并调用其函数或访问其属性。在这个例子中,我们可以在QML中调用`colorMaker.generateRandomColor()`函数来生成一个随机颜色。 main.qml文件中的代码如下: ```qml import QtQuick 2.12 import QtQuick.Controls 2.12 import an.qt.ColorMaker 1.0 ApplicationWindow { visible: true width: 400 height: 300 title: "QML with C++" Button { text: "Generate Random Color" onClicked: { var color = Qt.createQmlObject('import an.qt.ColorMaker 1.0; ColorMaker {}').generateRandomColor(); console.log("Random color: " + color); } } } ``` 通过运行上述代码,我们可以在QML界面中点击按钮,调用C++动态中的函数来生成随机颜色,并在控制台中打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值