不修改区域语言设置解决战地3/战地4在Windows8.1 / Windows10下的DirectX错误

本文共被喵星人侦察过172,753次。。。

PS:前方大堆废话,不想看的可以直接到文章结尾看解决方法。(Windows10用户遇到这个问题也可以用这个方法解决哦~~)

本喵不太喜欢玩儿游戏,在玩儿的游戏一共也没几个,还都不经常玩儿。之前一直用的是Windows 8,各种无压力。但是8.1Update1出了以后看着各种新功能总觉得不爽,于是果断重装系统安装Windows 8.1 。 网上各种流传Windows 8.1的兼容性很差, 刚装完的时候还很忐忑,结果用了一段时间后发现兼容性也还是可以的,至少常用的Adobe CC套装,VS CB神马的都能正常使用无压力。昨天晚上想打开战地3玩儿一会儿的时候,启动游戏结果弹出了这个玩意儿:

BF3-DirectX-Error
DirectX Error DirectX function “m_dxgiFactory->CreateSwapChain( m_device, &sd, &m_swapChain.assignGet())” failed with DXGI_ERROR_INVALID_CALL: The application has made an erroneous API call that it had enough information to avoid. This error is intended to denote that the application should be altered to avoid the error. Use of the debug version of the DXGI.DLL will provide run-time debug output with further information.. GPU: “Intel(R) HD Graphics 4600”, Driver: Unknown

一开始看到这个错误直觉性的感觉是驱动程序的问题,因为我明明用的是独显运行的游戏为什么最后会提示是集显出问题。。。于是官网下载最新驱动安装,重启,结果还是弹出这个坑爹的错误。。。再仔细看看是DirectX的错误,于是想要更新或者修复下DirectX看看行不行,结果Windows8以后的系统DirectX都是集成的,微软也不提供专门的安装包了,这一条路无效。于是祭出Google大神,一番搜索后发现了解决方案一:(不修改语言设置的方法在后面)

到控制面板>>时钟、语言和区域>>区域>>管理 里面,把其中  非Unicode程序的语言改成 英语,美国  ,然后重启

Change-Locale
修改系统区域语言设置 点击查看大图

试了一下这个方法,重启之后果然可以进游戏了,但是很多程序的中文字符全都变成了问号。。。这很影响日常使用啊,于是改回来,重启。喜闻乐见的又出现了文章开头的错误。。。于是,第一方案宣告失败。。。不过让我有了另外一个思路,那就是用Locale Emulator这种奇怪的软件,单独把战地的区域语言设置改成英文,方案确实可行但是每次启动游戏都需要用Locale Emulator来启动。。。很是麻烦,于是就继续研究怎么回事。。。经过又一番查找后找到这个博客,日文的看不太懂,还好有google translate帮忙,仔细看了博文之后终于知道这个问题出现的原因了。

 

战地3、战地4里面,主程序里面Battlefield 3™ 或者 Battlefield 4™ 这一个字符串中的™这一个字符就是导致出现DirectX问题的罪魁祸首。 ™ 这一个字符与系统中非英语的区域语言设置会有冲突,导致DirectX不能正确运行,于是游戏就只能默默地告诉你DirectX出问题了然后不能运行。

知道了问题出在哪里就好解决了,只要稍微编辑下主程序,把里面的™字符删掉就好了~在HEX里面99表示的是™这个字符,我们要把它替换成一个空字符NULL。具体方法如下:

用一个16进制编辑器(比如WinHex,UltraEdit也支持16进制编辑的哦)打开游戏程序文件(BF3.exe或者BF4.exe或者BF4_x86.exe)

如果你的游戏是战地4(BF4.exe BF4_x86.exe)

查找42 61 74 74 6C 65 66 69 65 6C 64 20 34 99 00 然后把里面的99改成00

即把42 61 74 74 6C 65 66 69 65 6C 64 20 34 99 00

改成42 61 74 74 6C 65 66 69 65 6C 64 20 34 00 00

如果你的游戏是战地3(BF3.exe)

查找42 61 74 74 6C 65 66 69 65 6C 64 20 33 99 00 然后把里面的99改成00

即把42 61 74 74 6C 65 66 69 65 6C 64 20 33 99 00

改成42 61 74 74 6C 65 66 69 65 6C 64 20 33 00 00

十六进制数值可能有不止一处,查找的时候需要修改所有的地方。

查找的时候要使用 查找十六进制数值 或者是类似的功能,不要使用查找字符串,不然是找不到所需要的数据的。用WinHex查找的时候记得吧要查找内容中间的空格都去掉(其它的编辑器可能也需要) 否则也是会找不到的哦~

修改完了之后,保存修改过的文件,然后直接运行就可以进入游戏啦~再也不会出现坑爹的DirectX错误了~哇咔咔尽情玩儿吧~