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
的帖子
你仔细看了夏娜那段代码么:(
typedef int (*RGSSEval)(const char* pScripts);
复制代码
定义了 RGSSEval 这个函数指针类型,暗示了原函数的签名是:int RGSSEval(const char*);
RGSSEval pRGSSEval = NULL;
复制代码
定义了一个全局的 RGSSEval 函数指针;
__get_check(RGSSEval);
复制代码
这里把函数指针传给了 __get_check 这个宏,展开后就是:
pRGSSEval = (RGSSEval)::GetProcAddress(hRgssCore, "RGSSEval");
if (!pRGSSEval)
{
ShowErrorMsg(hWnd, szTitle, "获取RGSS核心库导出函数失败 %s。", "RGSSEval");
goto __exit;
}
复制代码
也就是通过 GetProcAddress 以及之前获取的 DLL 模块句柄(LoadLibrary 返回值)得到了函数映射到当前进程后的地址;
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还报错。
# -*- coding:utf-8 -*-
require 'Win32API'
require 'pathname'
require 'iniparse' #读取ini文件
require 'cstruct/win32struct'
MAX_PATH=100
Gameini="Game.ini"
#----------
#FindWindow=Win32API.new("user32", "FindWindow", ['P','P'], 'L')
LoadLibraryA=Win32API.new("kernel32", "LoadLibraryA", ['P'], 'L')
GetProcAddress=Win32API.new("kernel32", "GetProcAddress", ['L','P'], 'L')
#-------
szAppPath=Pathname.new(File.dirname(__FILE__)).realpath
#puts Dir.getwd 获得当前的执行目录 ***
Dir.chdir(szAppPath) #改变当前目录
hd_gameini=IniParse.parse( File.read "#{Gameini}" )
szLibrary=hd_gameini["Game"]["Library"]
szTitle=hd_gameini["Game"]["Title"]
szScripts=hd_gameini["Game"]["Scripts"]
#通过核心库加载程序
hRgssCore = LoadLibraryA.Call(szLibrary);
pRGSSEval=Win32API.new(szLibrary, "RGSSEval", ['P'], 'I') # 这种方式只是使用,根本没加入内存
#pRGSSEval=GetProcAddress.Call(hRgssCore,"RGSSEval") #之后就不会用了
pRGSSSetupRTP=Win32API.new(szLibrary, "RGSSSetupRTP", ['P','P','I'], 'B')
pRGSSInitialize=Win32API.new(szLibrary, "RGSSInitialize", 'L', 'L')
pRGSSGameMain=Win32API.new(szLibrary, "RGSSGameMain", ['L','P','P'], 'V')
#puts Win32API::COLOR_WINDOWFRAME
pRGSSInitialize.Call(hRgssCore)
pRGSSEval.Call(" s=Sprite.new "); #不报错
pRGSSEval.Call(" p 12*7+2 "); #正常显示了
#还差窗口显示
#puts pRGSSEval
#pRGSSEval.Call("$DEBUG = true");
#exit
#hInstance=FindWindow.Call("ConsoleWindowClass",nil)
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1