0

我不知道我正在尝试做的事情是否可能,但它会很高兴。它将真正证明 C++ 是一门强大的语言。

所以,我有一个 DLL 和一个使用 DLL 导出的函数的 EXE。该函数接受一个参数,该参数是或必须是指向另一个函数的指针,并执行它。像这样的东西:

extern void RunFunction(void (*FunctionPonter)()) {
    (*FunctionPonter)();
}

我这样称呼它:

RunFunction(&FunctionToExecute);

作为参数发送的函数将没有参数,只是一个 void 函数。

因此,所有这些都有效,正如这里介绍的那样。现在,我想进一步定义(*void)()为,例如Action.

typedef (*void)() Action;

Action FunctionToExecute() {
    // My code. This function won't return results - void
}

我想将指针发送到我的 DLL 中的函数,如下所示:

// This is how it would be declared now in the DLL
extern void RunFunction(void (ACTION) {
    (*FunctionPonter)();
}

// and this is how I would like to use it
RunFunction(FunctionToExecute);

我正在使用 VC2010,如果可能的话,我不知道该怎么做。感谢您的想法、解释和帮助!

4

2 回答 2

2

好的,如果我正确理解了您的问题,您正在寻找一种仅允许将某些函数作为参数传递给 DLL 函数的方法。

使用 typedef 是行不通的,因为它只会创建一个别名;Action并且void (*)()在您的代码中与编译器无法区分。相反,您必须创建一个全新的类型。在 C++ 中,您应该强烈考虑使用仿函数

// Abstract functor
struct Action {
    virtual void operator() () const = 0;
};

// The DLL function
void RunFunction(const Action &action) {
    action();
}

// Define your function as a derived functor
struct FunctionToExecute : Action {
    void operator() () const { std::cout << "Hello\n"; }
};

// Run a function
RunFunction(FunctionToExecute());

演示:http: //ideone.com/5pl23

于 2012-07-01T16:05:36.687 回答
2

首先,函数类型的正确语法typedef

typedef void (*Action)();

其次,函数类型的 typedef-name 可用于声明该类型的函数,但不能用于定义此类函数。即,如果FunctionToExecute是您要通过指针执行的函数,则必须将其定义为

void FunctionToExecute() {
  /* whatever */
}

调用函数将被定义为

void RunFunction(ACTION p) {
  p();
}

对它的调用如下所示

RunFunction(FunctionToExecute);

就是这样。一元*&运算符对于函数指针是可选的。

于 2012-07-01T16:22:07.817 回答