Project1

标题: 如何调用RGSS103J.DLL内的RGSSEval函数?? [打印本页]

作者: clande    时间: 2010-11-28 20:57
标题: 如何调用RGSS103J.DLL内的RGSSEval函数??
请教有人知道么???
DLL可以通过这个函数来控制运行中的RM执行一些指令。
求这个函数的参数、返回值,以及用法……
作者: david50407    时间: 2010-11-28 22:25
参见夏娜的第三方RGSSPlayer
http://hi.baidu.com/tvga/blog/item/a4da02f3c4262fc70b46e0a9.html
作者: clande    时间: 2010-11-28 23:49
又研究了一段时间,貌似RGSSEval函数只能在RM脚本里执行,并不允许DLL调用,不知道还有没有其他的方式,让DLL和RM进行会话。。……感谢LS提供,夏娜大人的东西研究过。。
作者: 苏小脉    时间: 2010-11-29 04:01
回复 clande 的帖子

你仔细看了夏娜那段代码么:(

  1. typedef int    (*RGSSEval)(const char* pScripts);
复制代码
定义了 RGSSEval 这个函数指针类型,暗示了原函数的签名是:int RGSSEval(const char*);
  1. RGSSEval    pRGSSEval    = NULL;
复制代码
定义了一个全局的 RGSSEval 函数指针;
  1. __get_check(RGSSEval);
复制代码
这里把函数指针传给了 __get_check 这个宏,展开后就是:

  1. pRGSSEval = (RGSSEval)::GetProcAddress(hRgssCore, "RGSSEval");
  2.    if (!pRGSSEval)
  3.    {
  4.     ShowErrorMsg(hWnd, szTitle, "获取RGSS核心库导出函数失败 %s。", "RGSSEval");
  5.     goto __exit;
  6.    }
复制代码
也就是通过 GetProcAddress 以及之前获取的 DLL 模块句柄(LoadLibrary 返回值)得到了函数映射到当前进程后的地址;
  1. pRGSSEval("$DEBUG = true");
复制代码
最后有一些类似这样的一句,就是调用了 RGSSEval 把第一个参数作为脚本字符串求值。

这里还有一个例子:
http://rpg.blue/forum.php?mod=vi ... =%E6%BB%9A%E8%BD%AE
参考 DLL 代码里的 eval 函数。
作者: 长虹剑    时间: 2015-8-20 15:12
本帖最后由 长虹剑 于 2015-8-20 15:17 编辑

不好意思发错地方了,既然发了,就留下来吧

用纯ruby实现Game.exe 目前写到这里了,目前还没有写窗口的生成,打算就是完全调用Winapi实现。 还有本来想基于rgss3写的,可是不知道rgss3.dll有什么,怎么用。比如它就没有RGSSInitialize,直接用RGSSEval还报错。
  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)  
复制代码





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