UE4加载使用自定义dll动态链接库

本人在写这篇文章时候,网上已经有很多相关的文章,但是网上的文章缺少逐步指引,本人看的云里雾里,估计刚接触相关工作的人看的也不是很清楚。本着自己记录和让他人少踩一些坑的宗旨------这篇文章诞生了。好了,不多BB,直接进入主题。

创建自定义dll动态链接库

首先新建一个动态链接库的C++项目:

在这里插入图片描述

然后在项目里添加C++类:DllClass,内容如下:

//.h

#define DLL_EXPORT __declspec(dllexport)

#define PI 3.1415926

#ifdef __cplusplus
extern "C"
{
#endif	
	float DLL_EXPORT getCircleArea(float radius);
#ifdef __cplusplus

}

#endif

其中这几句是必须的,其他的可以省略掉,其他内容的意思是以C语言的方式编译这段代码,可以根据项目需要添加或删除

//.h
//要导出的函数必须要加__declspec(dllexport)前缀,此处声明DLL_EXPORT代替这个略显繁琐的前缀
#define DLL_EXPORT __declspec(dllexport)
//定义π
#define PI 3.1415927
//要导出的函数(求圆的面积)
float DLL_EXPORT getCircleArea(float radius);

cpp没什么可看的,实现了一个非常简单的一个求圆的面积的函数

//.cpp

#include "pch.h"
#include <math.h>
#include "dllClass.h"

float DLL_EXPORT getCircleArea(float radius)
{
	return (PI * pow(radius,2));
}

然后选择x64 Release开始编译:
在这里插入图片描述

这里注意不要傻乎乎选择x86,因为UE4是x64 Orz

编译成功后会在项目目录的 x64\Release 下看到已经生成成功dll文件了。
在这里插入图片描述

加载自定义dll动态链接库

首先创建一个ue4 c++的项目,相信这一步就不用我详细介绍了吧~

创建DLL的文件夹,和Content同级:
在这里插入图片描述

把上一步生成的dll文件拷贝到里面:
在这里插入图片描述

然后新建一个C++类用于加载和使用dll文件,选择继承:BlueprintFunctionLibrary
在这里插入图片描述
C++类里添加函数:

//.h

	UFUNCTION(BlueprintCallable, Category = "GZW|DLL")
		static float getCircleArea(float radius);
//.cpp

//求圆面积的函数指针
typedef float (*_getCircleArea) (float radius);

float MyBlueprintFunctionLibrary::getCircleArea(float radius)
{
//dll文件路径
	FString filePath = FPaths::Combine(*FPaths::ProjectDir(), TEXT("DLL/"), TEXT("GzwDll.dll")); // Concatenate the plugins folder and the DLL file.       

	if (FPaths::FileExists(filePath))		//Can the file be found?
	{

		void* DLLHandle;

		DLLHandle = FPlatformProcess::GetDllHandle(*filePath);
		if (DLLHandle != NULL)
		{
			_getCircleArea DLLgetCircleArea = NULL;
			//DLL中定义的函数的名称
			FString procName = "getCircleArea";					 //The name of the function defined in the DLL
			DLLgetCircleArea = (_getCircleArea)FPlatformProcess::GetDllExport(DLLHandle, *procName); // Export the DLL function.
			if (DLLgetCircleArea != NULL)
			{
				float out = DLLgetCircleArea(radius); // Call the DLL function, with arguments corresponding to the signature and return type of the function.
				return out; // return to UE
			}
		}
	}
	else
	{
		GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, TEXT("Dll file not found !!!"));
	}
	return 1.00f;
}

随便创建个蓝图放到世界里,圆的半径设置为3.0:
在这里插入图片描述
可以看到屏幕正确输出了圆的面积:
在这里插入图片描述

把自定义Dll封装成插件供UE引擎使用

待更新~~

![在这里插入图片描述](https://img-blog.csdnimg.cn/4a0d8c0c64dc42438c0a2270aabf7ac2.png

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值