関数ポインターをdll関数の引数として渡し、それらをdllの内部から呼び出すのは安全ですか?

StackOverflow https://stackoverflow.com/questions/653697

質問

いくつかの(dllであるかどうかにかかわらず)関数ポインタをdll関数の引数として渡し、それらをdllの内部から呼び出したいです。 http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fpref .htm それ:

DLLコードでは、関数ポインターが関数記述子を指すと想定されています。関数ポインターの呼び出しは、最初にポインターの逆参照を通じて関数アドレスを取得することによって行われます。次に、関数エントリに分岐します。非DLL関数ポインターがDLLコードに渡されるとき、それは関数エントリを直接指します。このようなポインターを使用して逆参照しようとすると、未定義の関数アドレスが生成されます。未定義のアドレスへの後続の分岐は、例外になる可能性があります。

このルールはVisual Studioおよびその他のコンパイラにも適用されますか?

正確にしようとしているのは、さまざまなdll関数と非DLL関数の間のメモリ割り当てと割り当て解除の問題を解決することです。私のアイデアは、2つの関数ポインタを-共通の割り当ておよび割り当て解除機能のために-初期化(たとえば、Initialize(<!> amp; malloc、<!> amp; free))のすべてのdllに渡し、次にこれらの共通を使用してすべてのメモリ管理を行うことですしたがって、常に互換性のある関数です。

役に立ちましたか?

解決

そうではありません。 DLLコードは、非DLLコードとまったく同じ方法で関数ポインターを扱います。そうでない場合、DLL内でqsort()(関数ポインター引数が必要)のような標準ライブラリ関数を使用できませんでした。

他のヒント

DLLへの関数ポインタの受け渡しは何世代にも渡って行われています。

GUIプログラミングで使用されるすべてのコールバック関数(進行状況バーの更新など)は、関数ポインターを使用します。

WIN32を使用して開発する場合、malloc / freeへの関数ポインターを使用する理由はありますか?単にmalloc / freeを直接使用しないのはなぜですか?

これは、私が過去に常に行ってきたことです。これが正しい方法を保証するわけではありません。
実際、あなたはそれが可能な限り最悪の方法であることを示すものとみなすかもしれません:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top