UE4 文件选择框OpenFileDialog在Shipping环境下崩溃报错

本文档详细介绍了如何将UE4的Developer模块(DesktopPlatform、DirectoryWatcher、SlateFileDialogs)集成到自定义插件中,包括步骤、代码修改和打包测试,以解决项目依赖问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**解决方案:**需要把依赖developer的三个模块(DesktopPlatformDirectoryWatcherSlateFileDialogs)源码拷贝到项目中,重新编译即可。

具体步骤:

  • 新建一个Plugin

  • 把developer路径(UE_4.26\Engine\Source\Developer)里的目录(DesktopPlatform、DirectoryWatcher、SlateFileDialogs)拷贝到Plugin的Source路径下

  • 修改目录文件名为(MyDesktopPlatform、MyDirectoryWatcher、MySlateFileDialogs),对应的Build.cs也需要改名字

  • 修改每个模块的Build.cs
    Build.cs 里涉及到这三个库的路径和名称全改成“Myxxxxxx”,

MySlateFileDialogs:

public class MySlateFileDialogs : ModuleRules
{
    public MySlateFileDialogs(ReadOnlyTargetRules Target) : base(Target)
    {
        PrivateDependencyModuleNames.AddRange(
            new string[] {
                "Core",
                "CoreUObject",
                "InputCore",
                "Slate",
                "SlateCore",
                "MyDirectoryWatcher",
            }
        );
    
        PrivateIncludePaths.AddRange(
            new string[] {
                "MySlateFileDialogs/Private",  
            }
        );

        PrivateIncludePathModuleNames.Add("TargetPlatform");
    }
}

MyDesktopPlatform:

public class MyDesktopPlatform : ModuleRules
{
	public MyDesktopPlatform(ReadOnlyTargetRules Target) : base(Target)
	{
		PrivateIncludePaths.Add("MyDesktopPlatform/Private");

		PrivateDependencyModuleNames.AddRange(
			new string[] {
				"Core",
				"ApplicationCore",
				"Json",
			}
		);

		if (Target.IsInPlatformGroup(UnrealPlatformGroup.Linux))
		{
			PrivateIncludePathModuleNames.AddRange(
				new string[] {
					"MySlateFileDialogs",
				}
			);

			DynamicallyLoadedModuleNames.AddRange(
				new string[] {
					"MySlateFileDialogs",
				}
			);

			AddEngineThirdPartyPrivateStaticDependencies(Target, "SDL2");
		}
	}
}

MyDirectoryWatcher:

public class MyDirectoryWatcher : ModuleRules
{
	public MyDirectoryWatcher(ReadOnlyTargetRules Target) : base(Target)
	{
		PrivateIncludePaths.Add("MyDirectoryWatcher/Private");

		PrivateDependencyModuleNames.Add("Core");
	}
}
  • 修改Plugin的uplugin文件
"Modules": [
		{
			"Name": "WinSelectedDialog",
			"Type": "Runtime",
			"LoadingPhase": "PreLoadingScreen",
			"WhitelistPlatforms": [
				"Win32",
				"Win64"
			]
		},
		{
			"Name": "MyDesktopPlatform",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"WhitelistPlatforms": [
				"Win32",
				"Win64"
			]
		},
		{
			"Name": "MySlateFileDialogs",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"WhitelistPlatforms": [
				"Win32",
				"Win64"
			]
		},
		{
			"Name": "MyDirectoryWatcher",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"WhitelistPlatforms": [
				"Win32",
				"Win64"
			]
		}
	]
  • 修复编译错误
  1. 去掉像DESKTOPPLATFORM_API这样的宏
  2. 修改模块实现的模块名称 (可全项目搜索IMPLEMENT_MODULE)
    IMPLEMENT_MODULE( FDirectoryWatcherModule, MyDirectoryWatcher );
    IMPLEMENT_MODULE(FSlateFileDialogsModule, MySlateFileDialogs);
    IMPLEMENT_MODULE( FDesktopPlatformModule, MyDesktopPlatform );
  • 弹窗代码实现
FString UMySelectedDialogBPLibrary::OpenFileDialog()
{
	void* ParentWindowPtr = FSlateApplication::Get().GetActiveTopLevelWindow()->GetNativeWindow()->GetOSWindowHandle();
	IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get();

	TArray<FString> OutFileNames;

	if (DesktopPlatform)
	{
		EFileDialogFlags::Type SelectionFlag = EFileDialogFlags::None;
		DesktopPlatform->OpenFileDialog(ParentWindowPtr,
			TEXT("请选择资源"),
			TEXT("/"),
			TEXT(""),
			TEXT("(Image Files)|*.BMP;*.JPG;*.PNG;*.JPEG;)"),
			//LOCTEXT("Image Files", "Stats files (*.BMP)|*.BMP;*.JPEG|Raw Stats files (*.PNG)|*.PNG").ToString(),
			SelectionFlag,
			OutFileNames);
	}

	if (OutFileNames.Num() > 0)
	{
		return FString(OutFileNames[0]);
	}
	else
	{
		return TEXT("");
	}
}
  • 打包shipping测试

下面链接可以下载打包好的:https://download.youkuaiyun.com/download/killfunst/20322471

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DvLee1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值