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を使用すると、エイリアスが作成されるだけなので、機能しません。コード内のコンパイラと区別できませんActionvoid (*)()代わりに、まったく新しいタイプを作成する必要があります。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 に答える