个人学习记录,如有错误敬请谅解
开发环境:
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项目后,下一步修改源码进行优化
- 去掉界面选择,默认读取同文件夹下的path.ini以获取程序名字,再拼接出要打开的.exe的完整路径,从而将整个VxKex的处理进行透明化。
- 去掉莫名其妙的报错界面
源码修改,进一步优化
该项目是用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项目了,问题解决。