在 C++ 中将字符串作为函数调用
Calling strings as functions in C++
我正在用本机 C++ 为其他用户编写 'skeleton' 前端,这些用户正在创建我将 'call' 取决于传入的参数的函数。例如:
skeleton.exe /foo param1
将用于在我的骨架中调用函数 "int doFoo(param1){return 0;}"
。随着越来越多的团队成员编写函数,我也需要添加这些函数。
我有一个杂念——我什至不确定这是否可能——会有一个资源文件——或者,也许,一个资源 xml 文件——它会列出命令行参数,参数数量,然后是我需要为该参数调用的函数。所以我上面的资源文件看起来像:
foo 1 doFoo
这样,当人们创建他们的函数时,他们所要做的就是将它添加到资源文件中。
我 运行 遇到的问题 - 我想知道它是否可能 - 是我是否可以 'interpret' 那个 'doFoo'
作为一个函数,如果它被读取从资源文件。有什么可以让我 'interpret' 一个字符串作为我可以调用的函数吗?
您将需要映射 字符串到函数指针。
一种方法是创建查找 table 另一种方法是使用 std::map
。
在互联网上搜索 "c++ dispatch",也许还有 "c++ double dispatch"。
我想我明白了!我只需要确保每个添加的函数都用 extern "C" __declspec(dllexport)
声明!示例:
extern "C" __declspec(dllexport) int square(int x)
{
return (x*x);
}
typedef int(__cdecl *MYPROC)(int);
int _tmain(int argc, _TCHAR* argv[])
{
LPCSTR funcName = "square";
HMODULE hMod = GetModuleHandle(NULL);
if (hMod != NULL)
{
cout << "hMod is not NULL!" << endl;
MYPROC abstractSquare = (MYPROC)GetProcAddress(hMod, funcName);
if (NULL != abstractSquare)
{
cout << "abstractSquare is not NULL!" << endl;
int y = (abstractSquare)(10);
cout << "y = " << y << "!" << endl;
}
else
{
cout << "abstractSquare is NULL!" << endl;
}
}
else
{
cout << "hMod is NULL!" << endl;
}
return 0;
}
我正在用本机 C++ 为其他用户编写 'skeleton' 前端,这些用户正在创建我将 'call' 取决于传入的参数的函数。例如:
skeleton.exe /foo param1
将用于在我的骨架中调用函数 "int doFoo(param1){return 0;}"
。随着越来越多的团队成员编写函数,我也需要添加这些函数。
我有一个杂念——我什至不确定这是否可能——会有一个资源文件——或者,也许,一个资源 xml 文件——它会列出命令行参数,参数数量,然后是我需要为该参数调用的函数。所以我上面的资源文件看起来像:
foo 1 doFoo
这样,当人们创建他们的函数时,他们所要做的就是将它添加到资源文件中。
我 运行 遇到的问题 - 我想知道它是否可能 - 是我是否可以 'interpret' 那个 'doFoo'
作为一个函数,如果它被读取从资源文件。有什么可以让我 'interpret' 一个字符串作为我可以调用的函数吗?
您将需要映射 字符串到函数指针。
一种方法是创建查找 table 另一种方法是使用 std::map
。
在互联网上搜索 "c++ dispatch",也许还有 "c++ double dispatch"。
我想我明白了!我只需要确保每个添加的函数都用 extern "C" __declspec(dllexport)
声明!示例:
extern "C" __declspec(dllexport) int square(int x)
{
return (x*x);
}
typedef int(__cdecl *MYPROC)(int);
int _tmain(int argc, _TCHAR* argv[])
{
LPCSTR funcName = "square";
HMODULE hMod = GetModuleHandle(NULL);
if (hMod != NULL)
{
cout << "hMod is not NULL!" << endl;
MYPROC abstractSquare = (MYPROC)GetProcAddress(hMod, funcName);
if (NULL != abstractSquare)
{
cout << "abstractSquare is not NULL!" << endl;
int y = (abstractSquare)(10);
cout << "y = " << y << "!" << endl;
}
else
{
cout << "abstractSquare is NULL!" << endl;
}
}
else
{
cout << "hMod is NULL!" << endl;
}
return 0;
}