将指针作为记录成员传递给方法是否安全?

时间:2009-10-02 21:27:24

标签: delphi dll

我想在一个dll中实现一个函数,它接受一个记录作为参数,并将此记录作为一些字段来保存指向回调例程的指针。这会安全吗?

3 个答案:

答案 0 :(得分:3)

我不明白为什么不。我认为过程/方法指针的所有常见问题都适用,因此如果它是方法指针,则对象需要存在。

答案 1 :(得分:3)

是的,拥有指向包含其他指针的记录的指针是完全安全的。

但是,您的标题提到了方法。 DLL很少请求方法指针,因为方法指针只存在于Delphi和C ++ Builder中。编写的DLL期望其他工具能够使用它们将请求普通函数指针,因此请注意方法指针与指向独立子例程的指针兼容。如果你试图混合它们,编译器通常会发出警告,但是类型转换可以平息该错误消息。根据经验,如果你是一个类型转换函数指针或方法指针,你做错了。如果你的类型声明和你的函数声明是正确的,你就不需要输入。

同样,如果你使用@运算符来创建函数指针或方法指针,那么你可能做错了。在大多数情况下,编译器可以自动检测和分配兼容的代码指针,而不会告诉它有指针。使用@可能会抑制某些Delphi的类型检查。

答案 2 :(得分:0)

这是安全的,但您应该注意两个问题:

声明为局部变量的记录存储在堆栈中,当函数返回时它们会消失。您应该考虑使用new / dispose函数在堆上分配/处置它们。

如果DLL将由delphi以外的程序(或者甚至是不同版本的delpi)使用,则必须使用打包记录。