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

Project1

 找回密码
 注册会员
搜索
查看: 5102|回复: 7
打印 上一主题 下一主题

[原创发布] 脑残物Custom RGSS Player(Game.exe)

[复制链接]

Lv1.梦旅人

梦石
0
星屑
1788
在线时间
16 小时
注册时间
2014-12-7
帖子
4
1
发表于 2015-8-19 13:17:38 | 显示全部楼层
本帖最后由 长虹剑 于 2015-8-20 15:06 编辑

@英顺的马甲  百度空间的链接失效了,你给的参考链接打不开,不知哪里还有。
还有我很想知道RGSSxxx.dll到底是如何调用的,如何用纯ruby来启动程序,或者如何才能在我自己的ruby程序中使用RGSS的内置类。

请问楼主是如何知道 dll 里面有 RGSSEval,RGSSGameMain 等函数的,并且如何知道是用顺序,也就是楼主破解了dll了?我想知道如何破解,还有在rgss300.dll中RGSSInitialize是不存在的,所以如何给rgss300重写个启动器呢?

请给一个思路
@晴兰  

点评

那个百度网址是夏娜前辈写的第三方RGSSPlayer,至于解说可参考http://rm.66rpg.com/forum.php?mod=redirect&goto=findpost&ptid=162330&pid=1576931  发表于 2015-8-20 12:17
赋值全在216行  发表于 2015-8-20 12:06
那是c++  发表于 2015-8-20 12:04
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
1788
在线时间
16 小时
注册时间
2014-12-7
帖子
4
2
发表于 2015-8-20 15:14:18 | 显示全部楼层
用纯ruby实现Game.exe 目前写到这里了,参照你的那个程序写的,目前还没有写窗口的生成,打算就是完全调用Winapi实现。 还有本来想基于rgss3写的,但是你给的这个例子不能用,我也不知道dll有什么,怎么用。
  1. # -*- coding:utf-8 -*-
  2. require 'Win32API'
  3. require 'pathname'
  4. require 'iniparse'  #读取ini文件
  5. require 'cstruct/win32struct'


  6. MAX_PATH=100
  7. Gameini="Game.ini"
  8. #----------
  9. #FindWindow=Win32API.new("user32", "FindWindow", ['P','P'], 'L')
  10. LoadLibraryA=Win32API.new("kernel32", "LoadLibraryA", ['P'], 'L')
  11. GetProcAddress=Win32API.new("kernel32", "GetProcAddress", ['L','P'], 'L')
  12. #-------
  13. szAppPath=Pathname.new(File.dirname(__FILE__)).realpath
  14. #puts Dir.getwd  获得当前的执行目录 ***
  15. Dir.chdir(szAppPath) #改变当前目录

  16. hd_gameini=IniParse.parse( File.read "#{Gameini}" )
  17. szLibrary=hd_gameini["Game"]["Library"]
  18. szTitle=hd_gameini["Game"]["Title"]
  19. szScripts=hd_gameini["Game"]["Scripts"]

  20. #通过核心库加载程序
  21. hRgssCore = LoadLibraryA.Call(szLibrary);
  22. pRGSSEval=Win32API.new(szLibrary, "RGSSEval", ['P'], 'I') # 这种方式只是使用,根本没加入内存
  23. #pRGSSEval=GetProcAddress.Call(hRgssCore,"RGSSEval") #之后就不会用了
  24. pRGSSSetupRTP=Win32API.new(szLibrary, "RGSSSetupRTP", ['P','P','I'], 'B')
  25. pRGSSInitialize=Win32API.new(szLibrary, "RGSSInitialize", 'L', 'L')
  26. pRGSSGameMain=Win32API.new(szLibrary, "RGSSGameMain", ['L','P','P'], 'V')
  27. #puts Win32API::COLOR_WINDOWFRAME

  28. pRGSSInitialize.Call(hRgssCore)
  29. pRGSSEval.Call(" s=Sprite.new "); #不报错
  30. pRGSSEval.Call(" p 12*7+2 "); #正常显示了
  31. #还差窗口显示


  32. #puts pRGSSEval
  33. #pRGSSEval.Call("$DEBUG = true");
  34. #exit

  35. #hInstance=FindWindow.Call("ConsoleWindowClass",nil)  
复制代码

点评

看楼下  发表于 2015-8-21 17:20
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
1788
在线时间
16 小时
注册时间
2014-12-7
帖子
4
3
发表于 2015-8-21 20:45:17 | 显示全部楼层
多谢楼主,看了你的程序真的让我大开眼见,没想到winapi还可以这样用,让程序减少了不少。其实今天中午我的程序也写完了,但是有300行之多,主要是定义了半天cstruct。刚才看了你的程序,下载后在我这里运行不了,所以就想到用你的程序来简化我的程序。本来想另外开帖,又觉得是在这个帖里面长大的所以就放在这里了。

示例工程如下   RGSS纯ruby启动器.zip (1.13 MB, 下载次数: 120)
程序代码如下
  1. # -*- coding:utf-8 -*-
  2. =begin
  3. 参考资料
  4. https://rpg.blue/thread-377723-1-1.html  想法来源(后来还用楼主的脚本重新改写)
  5. http://skandhas.iteye.com/blog/809806 解决了创建windows窗口的问题
  6. 有些windows的常量没有定义需要查看MSDN

  7. http://rpg.blue/thread-282803-1-1.html  解决了最后读不了脚本文件的问题

  8. 解决不了的问题
  9. 1.RTP无法加载(也不知道加载是什么原理)
  10. 2.想知道RGSS.dll是如何实现的
  11. 3.RGSSGameMain 究竟干了什么,为什么之前的RGSSEval不能使用Sprite
  12. =end

  13. require 'Win32API'
  14. require 'pathname'
  15. require 'iniparse'  #读取ini文件

  16. RGSSversion=3 # 1 or 3
  17. Gameini="Game_debug.ini" #"Game.ini"
  18. WndClassName = "Pure Ruby Window For RGSS"
  19. @title=WndClassName
  20. #--------
  21. szAppPath=Pathname.new(File.dirname(__FILE__)).realpath
  22. #puts Dir.getwd  获得当前的执行目录 ***
  23. Dir.chdir(szAppPath) #改变当前目录
  24. #-------------
  25. #隐藏掉控制台
  26. #Win32API.new('user32', 'ShowWindow', 'li', 'i').call(
  27. #    Win32API.new('kernel32', 'GetConsoleWindow', 'v', 'l').call, 0)

  28. #-------------
  29. @hInstance = Win32API.new('kernel32', 'GetModuleHandle', 'l', 'l').call(0)
  30. @wndclass = [
  31.         43, # style
  32.         Win32API.new('kernel32', 'GetProcAddress', 'lp', 'l').call(
  33.                 Win32API.new('kernel32', 'LoadLibrary', 'p', 'l').call('User32.dll'),
  34.                 'DefWindowProcW'), # wndproc
  35.         0, # class extra
  36.         0, # wnd extra
  37.         @hInstance,
  38.         Win32API.new('user32', 'LoadIcon', 'll', 'l').call(0, 32512), # icon
  39.         Win32API.new('user32', 'LoadCursor', 'll', 'l').call(0, 32512), # cursor
  40.         Win32API.new('gdi32', 'GetStockObject', 'i', 'l').call(4), # brush
  41.         0, # menu name
  42.         WndClassName # class name
  43. ].pack('ILiiLLLLLp')

  44. atom = Win32API.new('user32', 'RegisterClass', 'p', 'l').call(@wndclass)
  45. atom &=0x0000ffff
  46. return if atom==0
  47. #在第一个实现的脚本中atom本来是要用在WndClassName位置的
  48. x=200; y=100; width=640 ; height=480
  49. @hWnd = Win32API.new('user32','CreateWindowExA','lpplllllllll','l').call(
  50.         0x100, WndClassName, @title, 0x90CA0000, x, y, width, height, 0, 0, @hInstance, 0)
  51. #-------------
  52. hd_gameini=IniParse.parse( File.read "#{Gameini}" )
  53. szLibrary=hd_gameini["Game"]["Library"]
  54. szTitle  =hd_gameini["Game"]["Title"]
  55. szScripts=hd_gameini["Game"]["Scripts"]
  56. szRtpName=hd_gameini["Game"]["RTP"]
  57. @title=szTitle
  58. #通过核心库加载程序
  59. @hRgssCore = Win32API.new('kernel32', 'LoadLibrary', 'p', 'l').call(szLibrary)
  60. pRGSSEval=Win32API.new(szLibrary, "RGSSEval", ['P'], 'I')
  61. pRGSSSetupRTP=Win32API.new(szLibrary, "RGSSSetupRTP", ['P','P','I'], 'B')
  62. pRGSSInitialize=if RGSSversion==3
  63.     Win32API.new(szLibrary, "RGSSInitialize3", 'L', 'L')
  64. elsif RGSSversion==1
  65.     Win32API.new(szLibrary, "RGSSInitialize", 'L', 'L')
  66. end
  67. pRGSSGameMain=Win32API.new(szLibrary, "RGSSGameMain", ['L','P','P'], 'V')
  68. #puts Win32API::COLOR_WINDOWFRAME
  69. def stop
  70.         Win32API.new('kernel32', 'FreeLibrary', 'l', 'i').call(@hRGSSCore) if @hRGSSCore and @hRGSSCore != 0
  71.         Win32API.new('user32', 'DestroyWindow', 'l', 'i').call(@hWnd) if @hWnd and @hWnd != 0
  72.         Win32API.new('user32', 'UnregisterClass', 'pl', 'i').call(WndClassName, @hInstance)
  73.         exit
  74. end

  75. #RTP就是不行
  76. szRtpName= [0].pack('C') * 1024
  77. p pRGSSSetupRTP.Call("#{Gameini}", szRtpName, 1024)

  78. pRGSSInitialize.Call(@hRgssCore)  # 没有这个就不行,说明还是有关系的

  79. szScripts="Scripts.rvdata2"

  80. class String
  81.   MultiByteToWideChar = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  82.   WideCharToMultiByte = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  83.   def to_uni
  84.     len = MultiByteToWideChar.call 65001, 0, self, -1, nil, 0
  85.     buf = "\0" * (len * 2 + 2)
  86.     MultiByteToWideChar.call 65001, 0, self, -1, buf, buf.size / 2

  87.     buf
  88.   end

  89.   def from_uni
  90.     len = WideCharToMultiByte.call 65001, 0, (self.respond_to?(:force_encoding) ? self.force_encoding("ASCII-8BIT") : self) + "\000\000", -1, nil, 0, nil, nil
  91.     ret = "\0" * len
  92.     WideCharToMultiByte.call 65001, 0, self, -1, ret, ret.size, nil, nil

  93.     self.respond_to?(:force_encoding) ?
  94.     ret.force_encoding("ASCII-8BIT").delete("\000") :
  95.     ret.delete("\000")
  96.   end
  97. end

  98. pRGSSGameMain.call(@hWnd,szScripts.to_uni,"") #必须这样才行

  99. stop
复制代码

点评

而且有个东西叫做openrgss  发表于 2015-8-22 01:59
准确来说是32位ruby  发表于 2015-8-22 01:50
**代码**  发表于 2015-8-22 01:50
我那个程序是针对32位windows写的  发表于 2015-8-22 01:48
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-12 16:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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