设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2299|回复: 4

[已经解决] 又遇到个Win32API.new的问题,不能加载中文路径

[复制链接]

Lv2.观梦者

梦石
0
星屑
470
在线时间
177 小时
注册时间
2006-10-3
帖子
618
发表于 2014-6-30 15:30:45 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 流川枫 于 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"一类的。

点评

证据就是乱码的汉字字数和原来的字数不匹配,这只存在于从UTF-8转宽字符。如果是宽字符转到多字符就算编码一般不至于改变汉字字数。  发表于 2014-6-30 16:11
然后再转换为什么都不重要,重要的是从UTF-8转到寬字符的时候是硬编码的日文编码。其实如果汉化的时候把这个地方改成CP_ACP活着中文编码就OK,残念  发表于 2014-6-30 16:06
OD跟踪发现LoadLibaryA里的中文乱码,也就是说RGSS没有用CP_ACP而是用日文编码将UTF-8转换为寬字符然后再转换为CP_ACP。  发表于 2014-6-30 15:57
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。

Lv1.梦旅人

梦石
0
星屑
76
在线时间
1379 小时
注册时间
2012-7-5
帖子
1698

开拓者

发表于 2014-6-30 19:45:56 | 显示全部楼层
LZ尝试着改rmxp的编码吧!

  -fk: -azogi:
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
68
在线时间
585 小时
注册时间
2013-5-25
帖子
1524
发表于 2014-6-30 20:13:32 | 显示全部楼层
纯摘录
不止是调用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

点评

现在为了这个无聊的问题害我还要多写个程序 挂钩LoadLibaryA 然后替换文本补上目录  发表于 2014-6-30 20:43
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
470
在线时间
177 小时
注册时间
2006-10-3
帖子
618
 楼主| 发表于 2014-6-30 20:40:33 | 显示全部楼层
kuerlulu 发表于 2014-6-30 19:45
LZ尝试着改rmxp的编码吧!

那还不容易,问题是我写的是通用的脚本而不是单个游戏用的,否则只要改一下RGSS的DLL里的编码换成CP_ACP就行了
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
470
在线时间
177 小时
注册时间
2006-10-3
帖子
618
 楼主| 发表于 2014-7-1 15:54:33 | 显示全部楼层
前言撤回,我之前搞错了,之所以字数不匹配是因为RGSS根本没有把UTF-8转换成本地编码。

解决办法太太太太简单了,就是直接传递本地编码的路径。也就是说如果现在是UTF-8那么就转换成CP_ACP然后传递给Win32API.new。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-3-29 15:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表