Project1

标题: 又遇到个Win32API.new的问题,不能加载中文路径 [打印本页]

作者: 流川枫    时间: 2014-6-30 15:30
标题: 又遇到个Win32API.new的问题,不能加载中文路径
本帖最后由 流川枫 于 2014-7-1 15:54 编辑

test=Win32API.new("D:\\测试\\test.dll","test",[],"v")
将出错

---------------------------
RMlinkSZK模版工程RMVX
---------------------------
脚本 'RMlinkSZK v2.1' 的第 107 行发生了 RuntimeError .

LoadLibrary: D:\测试\test.dll

---------------------------
确定   
---------------------------


但是test=Win32API.new("D:\\eng\\test.dll","test",[],"v")



奇特的是就算DLL是放在中文路径下,但只要在Win32API.new里不含有中文就能够加载,比如"..\\test.dll"一类的。
作者: kuerlulu    时间: 2014-6-30 19:45
LZ尝试着改rmxp的编码吧!
作者: 克莉丝    时间: 2014-6-30 20:13
纯摘录
不止是调用API,在其它方面用中文路径也会出问题,尽量不要使用吧

#==============================================================================
# ■ String
#------------------------------------------------------------------------------
#  String 类追加定义。
#==============================================================================
class String
        #----------------------------------------------------------------------------
        # ● API
        #----------------------------------------------------------------------------
        @@MultiByteToWideChar  = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
        @@WideCharToMultiByte  = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
        #----------------------------------------------------------------------------
        # ● UTF-8 转 Unicode
        #----------------------------------------------------------------------------
        def u2w
                i = @@MultiByteToWideChar.call(65001, 0 , self, -1, nil,0)
                buffer = "\0" * (i*2)
                @@MultiByteToWideChar.call(65001, 0 , self, -1, buffer, i)
                buffer.chop!
                return buffer
        end  
        #----------------------------------------------------------------------------
        # ● UTF-8 转系统编码
        #----------------------------------------------------------------------------
        def u2s
                i = @@MultiByteToWideChar.call(65001, 0 , self, -1, nil,0)
                buffer = "\0" * (i*2)
                @@MultiByteToWideChar.call(65001, 0 , self, -1, buffer, i)
                i = @@WideCharToMultiByte.call(0, 0, buffer, -1, nil, 0, nil, nil)
                result = "\0" * i
                @@WideCharToMultiByte.call(0, 0, buffer, -1, result, i, nil, nil)
                result.chop!
                return result
        end
        #----------------------------------------------------------------------------
        # ● 系统编码转 UTF-8
        #----------------------------------------------------------------------------
        def s2u
                i = @@MultiByteToWideChar.call(0, 0, self, -1, nil, 0)
                buffer = "\0" * (i*2)
                @@MultiByteToWideChar.call(0, 0, self, -1, buffer, buffer.size / 2)
                i = @@WideCharToMultiByte.call(65001, 0, buffer, -1, nil, 0, nil, nil)
                result = "\0" * i
                @@WideCharToMultiByte.call(65001, 0, buffer, -1, result, result.size, nil, nil)
                result.chop!
                return result
        end
end

作者: 流川枫    时间: 2014-6-30 20:40
kuerlulu 发表于 2014-6-30 19:45
LZ尝试着改rmxp的编码吧!

那还不容易,问题是我写的是通用的脚本而不是单个游戏用的,否则只要改一下RGSS的DLL里的编码换成CP_ACP就行了
作者: 流川枫    时间: 2014-7-1 15:54
前言撤回,我之前搞错了,之所以字数不匹配是因为RGSS根本没有把UTF-8转换成本地编码。

解决办法太太太太简单了,就是直接传递本地编码的路径。也就是说如果现在是UTF-8那么就转换成CP_ACP然后传递给Win32API.new。





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1