棘手的C问题。动态函数调用 我在用C/C++编写程序,但不应该涉及C++类,它分为2个部分。 首先是对线程和进程的基本需求。 第二个是用户自定义自己的功能。 这个模块就像,让我困惑的是用户自定义功能

棘手的C问题。动态函数调用 我在用C/C++编写程序,但不应该涉及C++类,它分为2个部分。 首先是对线程和进程的基本需求。 第二个是用户自定义自己的功能。 这个模块就像,让我困惑的是用户自定义功能,c++,c,function,dynamic,visual-c++,C++,C,Function,Dynamic,Visual C++,我的需要如下: 用户可以在给定文件夹中创建一个新的*.c文件,他们可以编写自己的函数 在他们完成了自己的函数和编译之后,我为他们提供了一个接口,可能是通过socket、http或argv命令。它们可以唤起以前定义的功能。 他们只给我一个类似own_function的字符串,然后我调用他们定义的函数 The question is : how to do this? How can i connect the strings and the functions??? 我认为宏观经济或许是一个解

我的需要如下: 用户可以在给定文件夹中创建一个新的*.c文件,他们可以编写自己的函数

在他们完成了自己的函数和编译之后,我为他们提供了一个接口,可能是通过socket、http或argv命令。它们可以唤起以前定义的功能。 他们只给我一个类似own_function的字符串,然后我调用他们定义的函数

The question is : how to do this? How can i connect the strings and the functions??? 我认为宏观经济或许是一个解决方案, 我要求用户如下定义其功能: 这只是一个例子

注意:当用户添加新功能时,整个系统需要重新编译

您可以在宏BEGIN_函数中执行某些操作来存储函数字符串和函数指针。。 但是我不知道如何具体编写宏。。
你有什么建议吗

Mh,对我来说这听起来有点像插件架构-在这种情况下,这个问题可能会帮助你: 我想您需要编写一些通用插件,而您的宏提供了适合用户定义函数和隐藏复杂内容的粘合剂

您还可以看看cppunit,它本质上使您能够编写一些函数,将它们封装在宏中,为cppunit框架提供粘合剂,然后让它们在通用的testrunner中运行。但这听起来并不容易。使用lua之类的脚本语言似乎更容易


更新:有一些c解释器,例如Cint。显然,TCC支持解释器式调用,我想这是内联编译和执行。我没有以这种方式使用这些工具,但它们可能会减轻将其编译成动态dll问题的痛苦。尽管我仍然希望听到rational走上这样一条道路,而不是使用Lua这样的脚本语言,因为Lua更适合这些目的。

Mh,这听起来有点像插件架构——在这种情况下,这个问题可能会帮助您: 我想您需要编写一些通用插件,而您的宏提供了适合用户定义函数和隐藏复杂内容的粘合剂

您还可以看看cppunit,它本质上使您能够编写一些函数,将它们封装在宏中,为cppunit框架提供粘合剂,然后让它们在通用的testrunner中运行。但这听起来并不容易。使用lua之类的脚本语言似乎更容易


更新:有一些c解释器,例如Cint。显然,TCC支持解释器式调用,我想这是内联编译和执行。我没有以这种方式使用这些工具,但它们可能会减轻将其编译成动态dll问题的痛苦。尽管我仍然希望听到rational走上这样的道路,而不是使用Lua这样的脚本语言,因为Lua更适合这些目的。

听起来像是在寻找一个外部函数接口。

听起来像是在寻找一个外部函数接口,例如。

你有很多选择

1如果函数很小,可以制作一个宏,该宏只声明一个函数,并将函数添加到指向函数类型def的函数的指针映射中

int FunctionName()
{
   //user code
}
map["FunctionName"] = FunctionName;
这样做的宏并不难编写

当您想要执行时,只需从map中选择function并调用它

< 2】你的函数较大,你必须考虑一个插件系统。导出函数的DLL。在服务器上,您可以枚举和加载这些DLL并执行请求的函数

3一个很好的版本,它可以使用脚本引擎,允许用户在服务器上执行脚本。您可以使用my或许多可用的免费脚本引擎之一来实现这一点

编辑:

我脑海中又出现了一种可能性

将.c文件添加到dll项目。 将u_declspecdllexport修饰符添加到每个函数,以便最终通过宏添加 枚举导出的函数如下 你有很多选择

1如果函数很小,可以制作一个宏,该宏只声明一个函数,并将函数添加到指向函数类型def的函数的指针映射中

int FunctionName()
{
   //user code
}
map["FunctionName"] = FunctionName;
这样做的宏并不难编写

当您想要执行时,只需从map中选择function并调用它

< 2】你的函数较大,你必须考虑一个插件系统。导出函数的DLL。在服务器上,您可以枚举和加载这些DLL并执行请求的函数

3一个很好的版本,它可以使用脚本引擎,允许用户在服务器上执行脚本。你可以使用我的或许多免费纸条中的一种来实现这一点 t发动机可用

编辑:

我脑海中又出现了一种可能性

将.c文件添加到dll项目。 将u_declspecdllexport修饰符添加到每个函数,以便最终通过宏添加 枚举导出的函数如下
这听起来像是一个关于如何处理动态库加载的家庭作业相关问题,大多数插件系统都是这样构建的。了解如何在平台中实现动态库加载

例如,在linux中,您将看到dlopen/dlclose/dlsym函数。基本上,用户实现了一个.so对象,当应用程序加载时,它会用dlopen打开.so文件,一旦加载了库,用户输入了一个字符串,您就可以用dlsym查找特定的函数名,并通过函数指针调用它。使用完库后,使用dlclose将其释放


这里有一些库可以提供一些帮助,比如Boost.Extension,它为底层操作系统调用提供了一个多平台接口。

这听起来像是一个关于如何处理动态库加载的家庭作业相关问题,大多数插件系统都是这样构建的。了解如何在平台中实现动态库加载

例如,在linux中,您将看到dlopen/dlclose/dlsym函数。基本上,用户实现了一个.so对象,当应用程序加载时,它会用dlopen打开.so文件,一旦加载了库,用户输入了一个字符串,您就可以用dlsym查找特定的函数名,并通过函数指针调用它。使用完库后,使用dlclose将其释放


这里有一些库,比如Boo..Expple,它为底层OS调用提供了多平台接口。

您是否考虑使用嵌入式语言,比如Lua,用于自定义函数?但是我的BISSI只允许C不理解您的解释…但在我看来,你似乎想编写自己的脚本语言。我同意9000。Lua是嵌入式的,占用空间很小什么,50k左右?并且在性能重要的社区中广泛存在,例如游戏开发。如果你必须重新发明轮子,你可能拥有技术上基于C的解决方案,但只有你会理解它-1.没有什么关于应用程序,程序环境,他们是什么样的用户。你是否考虑使用嵌入式语言,如Lua,自定义功能?但只有C是允许我的博思不知道我理解你的解释…但在我看来,你似乎想编写自己的脚本语言。我同意9000。Lua是嵌入式的,占用空间很小什么,50k左右?并且在性能重要的社区中广泛存在,例如游戏开发。如果你必须重新发明轮子,你可能拥有技术上基于C的解决方案,但只有你会理解它-1.与应用程序的功能、程序环境以及用户类型无关。Thanx对于您的回答,首选第一个选项。但我有问题。我写一个宏,我在宏中存储函数反射,但是宏是在函数领域之外调用的。在函数之外,在C…任何其他解决方案中都不允许给变量赋值。thanxin所有插件文件,必须包含一个头文件。该标题可以包含一个函数,用于将对名称ptr添加到map.Thanx。对于您的回复,首选第一个选项。但我有问题。我写一个宏,我在宏中存储函数反射,但是宏是在函数领域之外调用的。在函数之外,在C…任何其他解决方案中都不允许给变量赋值。thanxin所有插件文件,必须包含一个头文件。这个头可以包含一个将对名称ptr添加到映射中的函数。我不知道Macroideal rational,但例如VxWorks有一个外壳,它完全支持他所描述的内容:您可以动态加载一个库,然后从外壳调用一个键入其名称和参数的函数。它对于调试来说非常方便:我不知道Macroideal rational,但例如VxWorks有一个shell,它完全支持他所描述的内容:你可以加载一个动态库,然后从shell调用一个函数,输入他的名字和参数。它对于调试非常方便:
void EnumDllFunctions()
{
    BYTE *hMod = (BYTE*)GetModuleHandle("KERNEL32.DLL");
    IMAGE_NT_HEADERS *pnt = (IMAGE_NT_HEADERS*)&hMod[PIMAGE_DOS_HEADER(hMod)->e_lfanew];
    IMAGE_EXPORT_DIRECTORY *exp = (IMAGE_EXPORT_DIRECTORY*)&hMod[pnt->OptionalHeader.DataDirectory->VirtualAddress];
    DWORD *dwFunctions = (DWORD*)&hMod[exp->AddressOfNames];
   for (DWORD ctr = 0; ctr < exp->NumberOfNames; ctr++) 
   {
       printf("%s\n", (char*)&hMod[dwFunctions[ctr]]);
   }