我发现接受的答案相当具有误导性,因此我不得不发布另一个答案。
一个好的答案将解释使用 StrPtr 函数的好处(除了我上面的例子)和风险,可能你如何使用(或不使用)它,而不给出是否每个人都应该使用的意见它。
共有三个“隐藏”函数:VarPtr、StrPtr 和 ObjPtr。
-
VarPtr 用于需要获取变量的地址(即指向变量的指针)。
-
StrPtr用于需要获取字符串的文本数据的地址(即BSTR,指向字符串第一个Unicode字符的指针)。
-
ObjPtr 用于需要获取对象的地址(即指向对象的指针)。
它们是隐藏的,因为使用指针可能不安全。
但是你不能完全没有它们。
那么,你什么时候使用它们?
您在需要执行它们的工作时使用它们。
当您手头的问题是“我需要知道该变量的地址”时(例如,因为您想将该地址传递给 CopyMemory),您可以使用 VarPtr。
当您手头的问题是“我需要知道我的 BSTR 字符串的第一个字符的地址”时,您使用 StrPtr(例如,因为您想将它传递给仅接受宽字符串的 API 函数,但如果您只是声明参数As String,VB会帮你把字符串转成ANSI,所以你have to pass StrPtr)。
当您手头的问题是“我需要知道该对象的地址”时,您使用ObjPtr(例如,因为您想检查它的 vtable 或手动检查对象地址是否等于您之前知道的某个值)。
这些函数正确地完成了它们应该做的事情,你不应该害怕将它们用于预期目的。
如果你手头的任务不同,你可能不应该使用它们,但不是因为担心它们会返回错误的值——它们不会。
在一个完美的世界里,你会停留在那个结论上。不幸的是,这并不总是可能的,您提到的InputBox 情况就是其中一个例子。
根据上面的概述,您似乎应该不使用StrPtr 来确定是否在InputBox 中按下了取消。但实际上,您别无选择。
VBA.InputBox 返回一个String。 (当前文档中错误地省略了这一事实,使其看起来像返回 Variant。)将字符串传递给 StrPtr 是完全可以的。
但是,没有记录 InputBox 在取消时返回空指针。这只是一个观察。尽管实际上这种行为永远不会改变,但理论上它可能会在未来版本的 Office 中发生。但这种观察就是你所拥有的。没有记录的取消返回值。
考虑到这一点,您可以决定是否愿意在 InputBox 结果上使用 StrPtr。如果您乐于冒非常小的的风险,这种行为在未来发生变化并且您的应用程序因此而崩溃,您确实使用StrPtr,否则您切换到返回Variant 的Application.InputBox 和记录在取消时返回False。
但该决定不会基于StrPtr 告诉您的内容是否正确。这是。将VBA.InputBox 的String 结果传递给它总是安全的。
太棒了!但是为什么有些人坚持永远不要使用StrPtr?我读了它不受支持。为什么这很重要?
当有人坚持应该永远使用某些东西时,它几乎总是错的。甚至GoTohas its correct uses。