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

Project1

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

[已经解决] 如何调用RGSS103J.DLL内的RGSSEval函数??

[复制链接]

Lv1.梦旅人

简史

梦石
0
星屑
120
在线时间
422 小时
注册时间
2008-7-4
帖子
736

开拓者

跳转到指定楼层
1
发表于 2010-11-28 20:57:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
请教有人知道么???
DLL可以通过这个函数来控制运行中的RM执行一些指令。
求这个函数的参数、返回值,以及用法……

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
2
发表于 2010-11-28 22:25:34 | 只看该作者
RGE这万年大坑 啥时填起来@@

回复 支持 反对

使用道具 举报

Lv1.梦旅人

简史

梦石
0
星屑
120
在线时间
422 小时
注册时间
2008-7-4
帖子
736

开拓者

3
 楼主| 发表于 2010-11-28 23:49:42 | 只看该作者
又研究了一段时间,貌似RGSSEval函数只能在RM脚本里执行,并不允许DLL调用,不知道还有没有其他的方式,让DLL和RM进行会话。。……感谢LS提供,夏娜大人的东西研究过。。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
4
发表于 2010-11-29 04:01:20 | 只看该作者
回复 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 函数。

评分

参与人数 2星屑 +450 收起 理由
fux2 + 444 认可答案
clande + 6 认可

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
1788
在线时间
16 小时
注册时间
2014-12-7
帖子
4
5
发表于 2015-8-20 15:12:43 | 只看该作者
本帖最后由 长虹剑 于 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)  
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-23 05:17

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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