2

__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」が前面に含まれているマップオブジェクトを作成した後でコンパイルしようとすると、エラーがスローされます。

error C2059: syntax error : '>'

これは私にはあまり意味がありません。では、マップのタイプとして__stdcallを使用する正しい方法は何ですか?その前にintを追加することは私には疑わしいように思えましたが、追加しないと、指定された型が必要であると文句を言います。

また、混乱を招く場合は、CALLBACKは__stdcallの#defineです。

4

2 に答える 2

4

あなたは__stdcallタイプのように使用していますが、それは1つではありません。マップ定義で関数ポインタ型を使用する必要があります。

map<string, InitializeDLL> mapInt;

そもそもなぜ他のことをやろうとしたのかわかりませんが、すでに他の場所でこのタイプを使用しているので、ここでも必要だったのは明らかだったのではないでしょうか。

于 2012-06-20T16:53:32.517 に答える
3

関数ポインタ型は、単一の関数に限定されません。たとえば、InitializeDLL関数ポインタ型は、次のシグネチャを持つ任意の関数へのポインタを保持できますint foo(int,int)

おそらくCallbackFunction、そのtypedefの名前としては、コールバックに使用できる署名を持つすべての関数が含まれているため、より適切な名前になります。

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::functionboost::bindを使用できます。これらの機能のBoostバージョンとC++11バージョンは、まったく同じ方法で使用されます。Boostのドキュメントは、cppreferenceよりもはるかに役立ちます。

マップでコールバック関数を呼び出す方法(関数のシグネチャが異なる場合を含む)を示すと、使用方法とユースケースの例を示すことができるfunction場合がありbindます。


すべてのコマンドコールバックに同じ関数シグネチャを持たせてから、各コールバックに、作業を行うために必要なパラメータの抽出を任せることを検討してください。コマンドパラメータを含むオブジェクトは、コールバック関数への引数として渡すことができます。

パラメータのリストをまたはの形式でコールバック関数に渡すことも検討できstd::vector<boost::any>ますstd::vector<boost::variant>。次に、コールバック関数は、それぞれboost::anyまたはboost::variantその特定のパラメーターに関連付けられた特定のタイプに変換します。コマンドパラメータタイプが単純な組み込みタイプの場合は、を使用することもできますstd:vector<UnionOfPossibleParameterTypes>。ここUnionOfPossibleParameterTypesで、は単純な古いCスタイルunionです。

于 2012-06-20T17:12:46.867 に答える