C++:如何将 std::string 中的函数签名解析为 typedef 以从 DLL 调用函数?

问题描述 投票:0回答:1

我有一个 C++ 和 AngelScript 脚本引擎,我需要能够从 DLL 库调用函数。问题是解析签名。我需要从第一个字符串参数中获取函数签名和名称。

例如,我如何从字符串中获取:

"int MessageBoxW(int, wchar_t*, wchar_t*, int);"

从 C++ 调用的原始 typedef:

typedef int(*MessageBoxW)(int, wchar_t*, wchar_t*, int);

然后我分割字符串,在第一个空格之后我得到函数的名称,调用

GetProcAddress
,并使用参数调用该函数。

c++ string function typedef
1个回答
1
投票

例如,我如何从字符串中获取?

你不知道。 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()
    

© www.soinside.com 2019 - 2024. All rights reserved.