将函数指针作为参数传递给 dll 函数并从 dll 内部调用它们是不是安全?

Posted

技术标签:

【中文标题】将函数指针作为参数传递给 dll 函数并从 dll 内部调用它们是不是安全?【英文标题】:Is it safe to pass function pointers as arguments to dll functions and invoke them from inside of the dll?将函数指针作为参数传递给 dll 函数并从 dll 内部调用它们是否安全? 【发布时间】:2009-03-17 10:39:29 【问题描述】:

我想将一些(不管是否是 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函数之间的内存分配和释放问题。我的想法是在某些初始化(例如 Initialize(&malloc, &free))中将两个函数指针(用于通用分配和释放函数)传递给每个 dll,然后使用这些通用且始终兼容的函数进行所有内存管理。

【问题讨论】:

引用的文章不适用于 Windows。导出函数只在 Win16 中才有。 【参考方案1】:

这不是真的。 DLL 代码以与非 DLL 代码完全相同的方式处理函数指针。如果不是这样,就不能在 DLL 中使用标准库函数,如 qsort()(它需要一个函数指针参数)。

【讨论】:

【参考方案2】:

将函数指针传递给 DLL 已经存在好几代了。

GUI 编程中使用的所有回调函数(例如进度条更新)都使用函数指针。

使用 WIN32 进行开发时,是否有理由要使用指向 malloc/free 的函数指针?为什么不直接使用 malloc/free?

这就是我过去一直这样做的方式。并不是说这保证它是正确的方法。 事实上,你可能会认为这是最糟糕的方式:)

【讨论】:

"你为什么不直接使用 malloc/free?" - 因为在另一个 DLL 中“分配”的内存上的一个 DLL 中使用“free”最常导致崩溃。 我看不出提供一定程度的间接性将如何解决这个问题,除非您有自己的内存管理。只要您不执行双重释放,我就没有遇到从不同 DLL 进行 malloc/free 时崩溃的问题。 msdn.microsoft.com/en-us/library/ms235460.aspx 额外的间接级别提供对单个共享(在所有 dll 之间)函数的访问以进行内存管理。 这里的特殊状态是,如果其中一个 dll 与 CRT 的静态版本不匹配,则与 EXE 使用的 CRT(静态或动态)版本不匹配,则崩溃。

以上是关于将函数指针作为参数传递给 dll 函数并从 dll 内部调用它们是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给夹具函数

将 char * 参数传递给 C# 函数

将多列作为参数传递给函数,并从函数中为python中的数据框获取新列

将 lambda 函数作为第三个参数传递给 QObject::connect 时出错

将取消引用的指针作为函数参数传递给结构

将 lambda 作为模板参数传递给函数指针函数模板化