我有一个 C++ 和 AngelScript 脚本引擎,我需要能够从 DLL 库调用函数。问题是解析签名。我需要从第一个字符串参数中获取函数签名和名称。
例如,我如何从字符串中获取:
"int MessageBoxW(int, wchar_t*, wchar_t*, int);"
从 C++ 调用的原始 typedef:
typedef int(*MessageBoxW)(int, wchar_t*, wchar_t*, int);
然后我分割字符串,在第一个空格之后我得到函数的名称,调用
GetProcAddress
,并使用参数调用该函数。
例如,我如何从字符串中获取?
你不知道。 AngelScript 绑定了预定的功能,这意味着您需要在使用它之前注册
MessageBoxW
。 AngelScript 不会根据签名神奇地调用世界上的任何函数。它需要提前了解它。
r = engine->RegisterGlobalFunction("int MessageBoxW(int, wchar_t*, wchar_t*, int);", asFUNCTIONPR(MessageBoxW, (int, wchar_t*, wchar_t*), int), asCALL_CDECL);
因为
wchar_t
是它的一个特殊情况
beingused作为字符串而不是being字符串,上面的方法可能是错误的,你需要一个使用
asCString
的包装器(如果我记得的话)正确 - 抱歉,自从我测试 AngelScript 以来已经有一段时间了)或 ::std::wstring
。当然,这是假设您使用 UNICODE 构建的。这可能更接近您所需要的,但正如所说,您需要重新阅读文档并正确调整它:
#include <string>
int MyMessageBox(::std::wstring Text, ::std::wstring Caption)
{
MessageBoxW(g_hWnd, Text, Caption);
}
r = engine->RegisterGlobalFunction("int MyMessageBox(string, string, int);", asFUNCTIONPR(MyMessageBox, (wstring, wstring), int), asCALL_CDECL);
请注意,我没有包含窗口句柄。为什么?那么,为什么要将特定于操作系统的内容暴露给游戏内的脚本呢?脚本在沙箱内运行,这是有原因的。您需要缓存窗口(无论如何应该是游戏本身)并在包装器内使用它。
如果你不使用 UNICODE,当然你会使用
::std::string
和
MessageBoxA()
。至于typedef,你可以将它传递给asFUNCTIONPR()
。我建议您不要将其命名为与函数名称本身相同,可以在其前面加上
t:
tMyMessageBox()