Project1

标题: 【RGSSGameMain】VA脚本中如何调用RGSS300中的RGSSGameMain函数? [打印本页]

作者: ky52879    时间: 2013-2-2 12:00
标题: 【RGSSGameMain】VA脚本中如何调用RGSS300中的RGSSGameMain函数?
各位大大,最近发现XP和VA有很大的不同,举个例子:

RUBY 代码复制
  1. #参数1:游戏句柄,参数2:脚本文件地址,参数3:加密档案文件地址
  2. $RGSSGameMain = Win32API.new("RGSS102J", "RGSSGameMain", "IPP", "V")
  3. $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  4. $RGSSGameMain.call($GetActiveWindow.call,"C:\\Temp\\RMVA\\Scripts.rxdata","")


上面代码在XP工程中完美运行,但是请看下面

RUBY 代码复制
  1. #参数1:游戏句柄,参数2:脚本文件地址,参数3:加密档案文件地址
  2. $RGSSGameMain = Win32API.new("RGSS300", "RGSSGameMain", "IPP", "V")
  3. $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  4. $RGSSGameMain.call($GetActiveWindow.call,"C:\\Temp\\RMVA\\Scripts.rvdata2","")


在VA中却报错:


这是为什么啊?有没有人知道呢?能否帮下忙。。
作者: satgo1546    时间: 2013-2-2 12:22
脚本文件读取失败,检查脚本是否存在
然后,是不是VA专用格式的脚本
作者: ky52879    时间: 2013-2-2 19:29
satgo1546 发表于 2013-2-2 12:22
脚本文件读取失败,检查脚本是否存在
然后,是不是VA专用格式的脚本

老兄。。我都在研究API了。。你说我能犯这话错误吗?
PS:拜托帮帮忙呗
作者: 晴兰    时间: 2013-2-2 19:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: ky52879    时间: 2013-2-2 20:03
晴兰 发表于 2013-2-2 19:33
脚本文件名要用unicode,如果没有中文路径的话可以认为每个字符后面加个\0, 最后加上两个\0 ...

什么意思?看的不太明白,能否告诉我,你将我的代码拿去测试了吗?
难道RMXP和RMVA的编码格式不一致??
作者: orzfly    时间: 2013-2-2 20:45
本帖最后由 orzfly 于 2013-2-2 20:49 编辑

RUBY 代码复制
  1. $RGSSGameMain = Win32API.new("RGSS300", "RGSSGameMain", "IPP", "V")
  2. $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  3. $RGSSGameMain.call($GetActiveWindow.call,"C\000:\000\\\000T\000e\000m\000p\000\\\000R\000M\000V\000A\000\\\000S\000c\000r\000i\000p\000t\000s\000.\000r\000v\000d\000a\000t\000a\0002\000\000\000","")


RUBY 代码复制
  1. #==============================================================================
  2. # ■ String
  3. #------------------------------------------------------------------------------
  4. #  为字符串追加编码转换的机能。
  5. #==============================================================================
  6. # 参考:
  7. #http://msdn.microsoft.com/en-us/library/windows/desktop/dd319072(v=vs.85).aspx
  8. #http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx
  9. #http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
  10. #==============================================================================
  11. class String
  12.   MultiByteToWideChar = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  13.   WideCharToMultiByte = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  14.   def to_uni
  15.     len = MultiByteToWideChar.call 65001, 0, self, -1, nil, 0
  16.     buf = "\0" * (len * 2 + 2)
  17.     MultiByteToWideChar.call 65001, 0, self, -1, buf, buf.size / 2
  18.  
  19.     buf
  20.   end
  21.  
  22.   def from_uni
  23.     len = WideCharToMultiByte.call 65001, 0, (self.respond_to?(:force_encoding) ? self.force_encoding("ASCII-8BIT") : self) + "\000\000", -1, nil, 0, nil, nil
  24.     ret = "\0" * len
  25.     WideCharToMultiByte.call 65001, 0, self, -1, ret, ret.size, nil, nil
  26.  
  27.     self.respond_to?(:force_encoding) ?
  28.     ret.force_encoding("ASCII-8BIT").delete("\000") :
  29.     ret.delete("\000")
  30.   end
  31. end
  32.  
  33. $RGSSGameMain = Win32API.new("RGSS300", "RGSSGameMain", "IPP", "V")
  34. $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  35. $RGSSGameMain.call($GetActiveWindow.call,"C:\\Temp\\RMVA\\Scripts.rvdata2".to_uni,"")

作者: zhangbanxian    时间: 2013-2-2 21:17
确实有区别,用的w_char,不过话说这样有意义么?切换脚本?- -b
作者: ky52879    时间: 2013-2-2 21:38
orzfly 发表于 2013-2-2 20:45
$RGSSGameMain = Win32API.new("RGSS300", "RGSSGameMain", "IPP", "V")
$GetActiveWindow = Win32API.new ...

代码已经测试通过,很好很强大,但是有点遗憾:如果脚本路径里面有“中文”就不行了,有解决办法吗?
作者: ky52879    时间: 2013-2-3 13:37
中文路径的问题如果解决就可以认可啦,各位帮帮忙吧
作者: ky52879    时间: 2013-2-16 16:53
orzfly 发表于 2013-2-2 20:45
$RGSSGameMain = Win32API.new("RGSS300", "RGSSGameMain", "IPP", "V")
$GetActiveWindow = Win32API.new ...

十分感谢,这个转换脚本很强大,但是好像中文路径不能转。。有什么办法解决吗?




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