6

いくつかの(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(&malloc, &free) など) ですべての dll に渡し、これらの一般的で常に互換性のある関数を使用してすべてのメモリ管理を行うことです。

4

2 に答える 2

7

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

于 2009-03-17T10:44:42.073 に答える
6

Passing function pointers to a DLL has been done for generations.

All the callback functions used in GUI programming (for example progress bars update) use function pointers.

When developing using WIN32, is there a reason you want to use function pointers to malloc/free? Why are you not simply using malloc/free directly?

That is how I have always done it in the past. Not that this guarantees it's the correct way.
In fact, you might take that as an indication that it's the worst possible way :)

于 2009-03-17T11:03:02.717 に答える