个人学习记录,如有错误敬请谅解

开发环境:
Win10,UE5.2.1,RTX2070
部署环境:
Win7,RTX1650

问题分析:

UE官方明确指出UE5最低支持操作系统为win10,直接将UE5打包好的项目拷贝到win7下是不能正常打开运行的,但还是可以通过以下方法解决该问题,让UE5项目成功运行在win7系统下。

额外补充:如果想让UE5编辑器也在win7下打开,可参考以下网址。
https://board.eclipse.cx/viewtopic.php?p=4032

问题1:
win7内置DirectX11,想用DirectX12的话需要自己去安装,当然也可以在打包的时候直接选择使用DirecxtX11或者Vulkan,前提是显卡得支持。设置位置在“项目设置->平台->Windows->目标RHI”。在这里插入图片描述
问题2:
在win7下直接启动打包好的程序,会报错:
在这里插入图片描述
关于CreateFile2函数的资料参见:
https://learn.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-createfile2?redirectedfrom=MSDN

在这里插入图片描述
所以在win7系统中是没有这个函数的。

一番寻找后找到一个叫VxKex的开源工具,完美适应该需求,github地址:
https://github.com/vxiiduu/VxKex/releases

解决方法

下载VxKex的安装程序和源码:
在这里插入图片描述
先安装作者编译好的程序进行测试
安装完成后打开VXKEXLDR.EXE
在这里插入图片描述
在这里插入图片描述
选择要打开的exe,这里有一个点,要注意具体选择哪一个exe:
我的UE5程序名字为UE5PackageTest,则要选择打开:

\UE5PackageTest\Binaries\Win64\UE5PackageTest.exe

只有选择这个才能正常运行起来,如果选择外面的exe,即

\UE5PackageTest\UE5PackageTest.exe

则会报错,暂不清楚为什么。

点击Run后会报一个莫名其妙的错误

在这里插入图片描述
但确定后UE5程序会正常运行并打开。

:部分插件直接拿到win7也会有问题,如像素流插件PixelStreaming,会提示最低要求为win8,解决方法也很简单,。
项目额外勾选插件HardwareEncoders,在UE5的安装目录

\UE_5.2\Engine\Plugins\

下找到PixelStreaming和HardwareEncoders的文件夹拷贝到项目的Plugins下,重新生成解决方案,编译解决方案即可。

成功利用作者的程序打开UE5项目后,下一步修改源码进行优化

  1. 去掉界面选择,默认读取同文件夹下的path.ini以获取程序名字,再拼接出要打开的.exe的完整路径,从而将整个VxKex的处理进行透明化。
  2. 去掉莫名其妙的报错界面

源码修改,进一步优化

该项目是用visual studio 2010编写的,用高版本的vs打开后会报各种错误,我为了省事,直接安了VS2010。
将KexSetup右键设置为启动项目,在Debug、Release和Win32、x64下都编译一次,编译成功无问题,开始修改代码。

核心代码在VxKexLdr.c,具体原理大概看了下,就是程序在调用系统API寻找.dll时进行一个重定向操作,使其指向更高版本的.dll,从而解决问题。

增加头文件:

#include <stdlib.h>
#include <wchar.h>

原程序是支持直接打开和命令行启动的,这里不需要命令行启动了,因此
SpawnProgramUnderLoader函数下修改:

//GetExeFullPathFromCmdLine(lpszCmdLine, g_szExeFullPath);
wcscpy(g_szExeFullPath, lpszCmdLine);

注释掉该句,不写日志了,那个莫名其妙的报错就在这个函数里

//g_hLogFile = KexOpenLogFile(g_szExeFullPath);

程序入口函数EntryPoint,修改为:

#define FORCE_FLAG L"/FORCE "
#define CPIW_FLAG L"/CPIW "
#define FISH_FLAG L"/FISH"
#define MAX_PATH_LENGTH 512

NORETURN VOID EntryPoint(
	VOID)
{
	HINSTANCE hInstance = (HINSTANCE) NtCurrentPeb()->ImageBaseAddress;
	LPWSTR lpszCmdLine = GetCommandLineWithoutImageName();
	WCHAR szFilePath[MAX_PATH_LENGTH + 2];
	WCHAR szIniPath[MAX_PATH_LENGTH + 10];  // 加上文件名的长度
	WCHAR* pLastSlash;
	FILE* pFile;
	WCHAR* pNewLine;
	WCHAR szContent[MAX_PATH_LENGTH + 2];
	WCHAR szFilename[MAX_PATH + 2];

	SetFriendlyAppName(FRIENDLYAPPNAME);
	hInstance = (HINSTANCE) NtCurrentPeb()->ImageBaseAddress;
	lpszCmdLine = GetCommandLineWithoutImageName();

	if (*lpszCmdLine == '\0') {
		 // 获取当前可执行文件的路径
		
		GetModuleFileNameW(NULL, szFilePath, MAX_PATH_LENGTH);

		// 提取目录路径
		pLastSlash = wcsrchr(szFilePath, L'\\');
		if (pLastSlash != NULL) {
			*(pLastSlash + 1) = L'\0';  // 添加字符串结束符
		}

		// 构建path.ini的完整路径
		
		wcscpy(szIniPath, szFilePath);
		wcscat(szIniPath, L"path.ini");

		// 打开文件
		pFile = _wfopen(szIniPath, L"r");
		if (pFile == NULL) {
			CriticalErrorBoxF(L"Can't find file: \"%s\"",szIniPath);
			Exit(0);
		}

		// 读取文件内容
		if (fgetws(szContent, MAX_PATH_LENGTH + 2, pFile) == NULL) {
			CriticalErrorBoxF(L"Can't read file: \"%s\"",szIniPath);
			fclose(pFile);
			Exit(0);
		}

		// 去除换行符
		pNewLine = wcschr(szContent, L'\n');
		if (pNewLine != NULL) {
			*pNewLine = L'\0';  // 添加字符串结束符
		}

		// 关闭文件
		fclose(pFile);

		// 拼接exe路径
		wcscpy(szFilename, szFilePath);
		wcscat(szFilename, szContent);
		wcscat(szFilename, L"\\Binaries\\Win64\\");
		wcscat(szFilename, szContent);
		wcscat(szFilename, L".exe");

		pFile = _wfopen(szFilename, L"r");
		if (pFile == NULL) {
			CriticalErrorBoxF(L"Can't find file: \"%s\"",szFilename);
			fclose(pFile);
			Exit(0);
		}
		fclose(pFile);

		SpawnProgramUnderLoader(szFilename, TRUE, FALSE, FALSE, TRUE);
	}
	
	Exit(0);
}

改完后重新编译生成。
在\VxKex-Version0.0.0.3\x64\Release下找到KexSetup.exe,这个就是新的安装程序。拿到win7下进行安装,先将旧版本卸载掉,再重新运行进行安装。
安好后同样在Vxkex的安装目录找到VXKEXLDR.EXE,复制到UE5项目的根目录下,新建文本文档改名为path并修改后缀为.ini,在里面写上项目的名字

在这里插入图片描述
这样直接双击打开VxKexLdr.exe就可以直接启动UE5项目了,问题解决。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐