我正在尝试使用__stdcall创建函数名和函数指针的映射。下面是我目前获取函数指针的方法:
typedef int (CALLBACK* InitializeDLL)(int,int);
InitializeDLL initializeDLL = (InitializeDLL)GetProcAddress(hInstanceLibrary, "InitializeDLL");现在是我的地图:
map<string, int *__stdcall> mapInt;
mapInt["InitializeDLL"] = initializeDLL; //throws error for "InitializeDLL cannot be assigned to entity of type int*"这个错误正是我所期望的,但是我需要在__stdcall前面添加一个类型。如果我删除前面的"int“,它会报错:
Error: expected a type specifier如果我仅在前面包含"int“的情况下创建了map对象,然后尝试编译它,则会抛出错误:
error C2059: syntax error : '>'这对我来说没有多大意义。那么,使用__stdcall作为映射类型的正确方法是什么呢?在它前面添加int对我来说似乎很可疑,但如果我不添加它,它就会抱怨它需要一个指定的类型。
另外,回调是__stdcall的一个#定义,如果它令人困惑的话。
发布于 2012-06-21 01:12:47
函数指针类型不限于单个函数。例如,您的InitializeDLL函数指针类型可以包含指向具有以下签名的任何函数的指针:int foo(int,int)。
也许CallbackFunction是该类型定义的更好的名称,因为它包含了所有具有可用于回调的签名的函数:
typedef int (CALLBACK* CallbackFunction)(int,int);
CallbackFunction initializeDLL =
(InitializeDLL)GetProcAddress(hInstanceLibrary, "InitializeDLL");
map<string, CallbackFunction> mapInt;
mapInt["InitializeDLL"] = initializeDLL;还有更通用的方法来处理函数(甚至是成员函数)。如果你有能力/愿意使用新的C++11特性,你可以使用std::function和std::bind。如果没有,那么您可以使用boost::function和boost::bind。这些工具的Boost和C++11版本的使用方式完全相同。Boost文档将比cppreference更有帮助。
如果您向我们展示了您打算如何调用映射中的回调函数(包括函数签名不同的情况),我也许能够向您展示如何在您的用例中使用function和bind的示例。
您可以考虑让所有的命令回调都具有相同的函数签名,然后让每个回调负责提取执行其工作所需的任何参数。包含命令参数的对象可以作为参数传递给回调函数。
您还可以考虑以std::vector或std::vector的形式将参数列表传递给回调函数。然后,回调函数将每个boost::any或boost::variant转换为与该特定参数关联的特定类型。如果命令参数类型是简单的内置类型,您甚至可以使用std:vector<UnionOfPossibleParameterTypes>,其中UnionOfPossibleParameterTypes是一个普通的老式C风格的union。
发布于 2012-06-21 00:53:33
您正在像使用类型一样使用__stdcall,但它不是类型。您需要在映射定义中使用函数指针类型。
map<string, InitializeDLL> mapInt;我不确定为什么您一开始要尝试做其他事情,既然您已经在其他地方使用了这种类型,难道不应该很明显在这里也需要它吗?
https://stackoverflow.com/questions/11124367
复制相似问题