UE5 C++ 第三方动态库的使用

一. 首先要拷贝对应的 第三方库

bin里有dll动态库,include里有动态库需要的头文件。

二.在Target.cs里,进行设置

头文件前面的路径为公共路径

设置需要一起打包的三方库文件

三.加载这个库

FPlatformProcess::GetDllHandle将他解析为 任意类型,用void* 接受。

	//加载dllFString tmpDllPath = FPaths::GameSourceDir() + TEXT("LearnProject/BassSDK/bin/x64/bass.dll"); //解析这个库BassDllHandle = FPlatformProcess::GetDllHandle(*tmpDllPath);if (!BassDllHandle) return;

再用FPlatformProcess::GetDllExport.传入这个解析出来库的指针,和你要使用的函数名的TEXT类型,比如TEXT("BASS_Init")。返回也要进行指针转换,转换为对应的函数指针。没想到函数指针在这里居然被用到。

	//初始化bassBassInitTOFunc BassInitTO = (BassInitTOFunc)FPlatformProcess::GetDllExport(BassDllHandle, TEXT("BASS_Init")); //拿到这个库的某个函数(初始化)if (!BassInitTO) return;bool isBassInit = BassInitTO(-1, 44100, 0, NULL, 0);if (!isBassInit) return;

我们用函数指针BassInitTOFunc接住返回值。它的定义如下

typedef BOOL(*BassInitTOFunc)(int, DWORD, DWORD, HWND, const void*);

这里是给 函数指针起了 叫BassInitToFunc的别名。可以看这篇文章的第三部分

C语言指针进阶(一)——深入详解“函数指针”与“指针函数”-CSDN博客

四.来回用库里的函数达到播放音乐效果

#pragma once#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "bass.h"
#include "DLLManager.generated.h"/*** *///音效
#define AUDIO_BASS_BGM				"DiscoFlow.wav"
typedef BOOL(*BassInitTOFunc)(int, DWORD, DWORD, HWND, const void*);
typedef HSTREAM(*BassCreateTOFunc)(BOOL, const void*, QWORD, QWORD, DWORD);
typedef BOOL(*BassPlayTOFunc)(DWORD, BOOL);UCLASS()
class LEARNPROJECT_API UDLLManager : public UObject
{GENERATED_BODY()
public:void InitDLL();//BGMbool PlayBGMTO();void* BassDllHandle;//Bass dllHSTREAM BassBGM;
};
// Fill out your copyright notice in the Description page of Project Settings.#include "DLLManager.h"void UDLLManager::InitDLL()
{//加载dllFString tmpDllPath = FPaths::GameSourceDir() + TEXT("LearnProject/BassSDK/bin/x64/bass.dll"); //解析这个库BassDllHandle = FPlatformProcess::GetDllHandle(*tmpDllPath);if (!BassDllHandle) return;//初始化bassBassInitTOFunc BassInitTO = (BassInitTOFunc)FPlatformProcess::GetDllExport(BassDllHandle, TEXT("BASS_Init")); //拿到这个库的某个函数(初始化)if (!BassInitTO) return;bool isBassInit = BassInitTO(-1, 44100, 0, NULL, 0);if (!isBassInit) return;//创建bgm文件流BassCreateTOFunc BassCreateTO = (BassCreateTOFunc)FPlatformProcess::GetDllExport(BassDllHandle, TEXT("BASS_StreamCreateFile")); //拿到这个库的某个函数(加载流文件)if (BassCreateTO){FString AudioFile = FPaths::GameSourceDir() + TEXT("LearnProject/BassSDK/Audios/") + AUDIO_BASS_BGM;BassBGM = BassCreateTO(FALSE, TCHAR_TO_UTF8(*AudioFile), 0, 0, BASS_SAMPLE_LOOP);}
}bool UDLLManager::PlayBGMTO()
{if (!BassDllHandle) return false;BassPlayTOFunc BassPlayTO = (BassPlayTOFunc)FPlatformProcess::GetDllExport(BassDllHandle, TEXT("BASS_ChannelPlay"));  //拿到这个库的某个函数(单通道播放)if (BassPlayTO)return BassPlayTO(BassBGM, true);return false;
}

测试

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"class UDLLManager;UCLASS()
class LEARNPROJECT_API AMyActor : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesAMyActor();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;//音效管理UPROPERTY()UDLLManager* AudioManager;};
// Fill out your copyright notice in the Description page of Project Settings.#include "MyActor.h"
#include "DLLManager.h"// Sets default values
AMyActor::AMyActor()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;}// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{Super::BeginPlay();AudioManager = NewObject<UDLLManager>(this);if (AudioManager){AudioManager->InitDLL();// AudioManager->InitAudioManager();AudioManager->PlayBGMTO();}
}// Called every frame
void AMyActor::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95895.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++进阶——多态

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言&#xff1b; 文章目录 前言 一、多态的概念 二、多态的定义及实现 2.1、多态的构成条件 &#xff08;1&#xff09;虚函…

Swift 语法学习指南 - 与 Kotlin 对比

Swift 语法学习指南 - 与 Kotlin 对比 本指南专为有 Android/Kotlin 开发经验的开发者设计&#xff0c;通过对比学习快速掌握 Swift 语法 目录 语言基础对比变量与常量数据类型函数定义类与结构体继承与协议可选类型集合类型控制流闭包与Lambda扩展与Extension错误处理内存管理…

嵌入式C语言笔记十七——构造数据类型

一.结构体&#xff1a;1.类型定义&#xff1a;struct 结构体名 {数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;... };struct student {char name[32];char sex;int age;int score; };2.结构体变量定义&#xff1a;存储类型 数据类型 变量名;3.结构体元素初始化…

深入实践G1垃圾收集器调优:Java应用性能优化实战指南

深入实践G1垃圾收集器调优&#xff1a;Java应用性能优化实战指南 一、技术背景与应用场景 随着微服务和海量并发请求的普及&#xff0c;Java应用在生产环境中对低延迟和高吞吐的需求日益显著。传统的CMS和Parallel GC 在大内存场景下常出现Full GC 停顿时间长、吞吐下降等问题…

【JobScheduler】Android 后台任务调度的核心组件指南

JobScheduler 是 Android 平台上原生支持在直接启动模式&#xff08;Direct Boot Mode&#xff09;下执行任务的调度器。 相比 WorkManager 需要复杂的配置才能勉强支持直接启动&#xff0c;JobScheduler 在这方面有着天生的优势和明确的 API 支持。如果你面临的硬性要求是必须…

c# 调用basler 相机

目录 一联合halcon&#xff1a; 二 c# 原生 一联合halcon&#xff1a; 环境配置 下载安装pylon软件 下载安装halcon 创建 winform项目 test_basler 添加引用 打开pylon可以连接相机 可以看到我的相机id为23970642 &#xff08; c#联合halcon的基础教程&#xff08;案例…

《2025年AI产业发展十大趋势报告》四十六

《2025年AI产业发展十大趋势报告》四十六随着科技的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;作为引领新一轮科技革命和产业变革的战略性技术&#xff0c;正逐步渗透到各个行业和领域&#xff0c;成为推动经济社会发展的重要引擎。2023年&#xff0c;生成式AI的…

c++ 杂记

1. 为什么返回*this?2. 3. 友元函数的使用&#xff1a;需要头文件中类内外声明&#xff0c;cpp文件中实现定义哦// Sales_data.h #ifndef SALES_DATA_H #define SALES_DATA_H#include <string>class Sales_data {std::string bookNo;int units_sold 0;double revenue …

PDF文件基础-计算机字体

计算机字体的原理包含了字符编码、字形渲染和字体文件存储三个关键技术。 字符编码负责将每个字符映射到一个唯一的数字码&#xff1b;字形渲染则将这些数字码转换成屏幕或纸张上可识别的图形&#xff1b;字体文件存储则包含了字符的编码、图形描述信息以及字体的其他属性&…

华为IP(9)

OSPF的基本配置OSPF路由计算前言&#xff1a;1)同一区域内的OSPF路由器拥有完全一致的LSDB&#xff0c;在区域内部&#xff0c;OSPF采用SPF算法完成路由计算。2&#xff09;随着网络规模不断扩大&#xff0c;路由器为了完成路由计算所消耗的内存、CPU资源也越来越多。通过区域划…

java.nio.file.InvalidPathException异常

一.问题概述 本人在ubuntu22.04的操作系统上&#xff0c;运行java程序时创建一个文件时&#xff0c;由于文件名称中包含了中文&#xff0c;所以导致了程序抛出了java.nio.file.InvalidPathException的异常。 java.nio.file.InvalidPathException: Malformed input or input co…

Next系统总结学习(一)

下面我按题号逐条 详细 解释并给出示例与最佳实践。为便于阅读&#xff0c;我会同时给出关键代码片段&#xff08;伪代码/实用例子&#xff09;&#xff0c;并指出常见坑与解决方案。 1. 你是如何理解服务端渲染&#xff08;SSR&#xff09;的&#xff1f;它的核心工作流程是怎…

房屋安全鉴定需要什么条件

房屋安全鉴定需要什么条件&#xff1a;专业流程与必备要素解析房屋安全鉴定是保障建筑使用安全的重要环节&#xff0c;它通过对建筑结构、材料性能及使用状况的全面评估&#xff0c;为房屋的安全使用、改造或维护提供科学依据。随着城市建筑老化及自然灾害频发&#xff0c;房屋…

现代C++:现代C++?

C语言正在走向完美&#xff0c;所以&#xff0c;C语言值得学习&#xff08;甚至研究&#xff09;&#xff0c;这些知识可以成为一切编程的基础。然而在实践中&#xff0c;不必全面的使用C语言的各种特性&#xff0c;而应根据工程项目的实际情况&#xff0c;适当取舍&#xff08…

【C++】哈希表实现

1. 哈希概念 哈希(hash)又称散列&#xff0c;是⼀种组织数据的方式。从译名来看&#xff0c;有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建立一个映射关系&#xff0c;查找时通过这个哈希函数计算出Key存储的位置&#xff0c;进行快速查找 1.1 直接定址法…

ai 玩游戏 llm玩街霸 大模型玩街霸 (3)

1. 开源代码地址&#xff1a; https://github.com/OpenGenerativeAI/llm-colosseum 2. 架构&#xff1a; 3. 图片&#xff1a; 4. 感觉还是下面的步骤&#xff1a; a. 实时理解游戏当前环境&#xff0c;英雄角色&#xff0c;英雄状态 b. 根据当前状态感知&#xff0c;生成英雄…

2025年渗透测试面试题总结-59(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 一、SQL注入全解 二、XSS与文件漏洞 三、服务端漏洞专题 四、职业经验与能力评估 1、注入攻击原理是什么…

GPT系列--类GPT2源码剖析

无需多言&#xff0c;大家应该都用过了&#xff0c;如今都更新到GPT-5了。1. GPT-1回到2018年的NLP&#xff0c;神仙打架&#xff0c;BERT与GPT不分先后。GPT是“Generative Pre-Training”的简称&#xff0c;生成式的预训练。BERT和GPT肯定是GPT难训练&#xff0c;引用量也是B…

这是一款没有任何限制的免费远程手机控制手机的软件

这是一款没有任何限制的免费远程手机控制手机的软件支持安卓和苹果1.安装1.1被控制端安装airdroid1.2控制端air mirror2.登录账号控制端和被控制端登录同一个账号3.控制打开控制端软件选择要控制的机器直接点“远程控制“

Observability:更智能的告警来了:更快的分诊、更清晰的分组和可操作的指导

作者&#xff1a;来自 Elastic Drew Post 探索 Elastic Stack 告警的最新增强功能&#xff0c;包括改进的相关告警分组、将仪表盘链接到告警规则&#xff0c;以及将调查指南嵌入到告警中。 在 9.1 版本中&#xff0c;我们对告警进行了重大升级&#xff0c;帮助 SRE 和运维人员更…