- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在VB6中VarPtr
应该返回变量的地址,在本例中是变量的地址 str
它在堆栈上分配,并在内存中保存一个指向字符串的指针。 StrPtr
(或 StrPtr
)应该返回内存中分配的字符串的地址。 ByVal
应该只创建一个副本,但在这种情况下,它的工作方式很奇怪:
Dim str As String
str = "asd"
Debug.Print VarPtr(str)
Debug.Print VarPtr(ByVal str)
Debug.Print StrPtr(str)
1636452
110882980
110882980
VarPtr(ByVal str)
的结果同
StrPtr(str)
?
最佳答案
传递的字符串 ByVal
在 BStr 中传递包含 C 字符串的第一个字符的地址。 StrPtr
做同样的事情。
这样做的原因有两个。将 Unicode 传递给 API 调用和字符串构建。
将 Unicode 传递给 API 调用
您可以使用 StrPtr
将 Unicode 字符串发送到 API 函数时,使用字符串而不是字节数组。
Dim ByteArr() as Byte
Var1="My Text"
ByteArr = Var1
APICall(ByteArr(0))
APICall(StrPtr(Var1))
declare
时,Unicode 字符串被转换为 ANSI 字符串。声明为 Win 95 没有做 unicode。
Left
将其内置到 VBA 中。 ,
Right
, 和
Mid
声明 ,不是
功能 (他们重载)。
Sub Main()
Dim Var As String
Var = "gggggggggggg"
MsgBox StrPtr(Var)
Mid(Var, 1, 2) = "xx"
MsgBox StrPtr(Var) & " - " & Var
End Sub
ByVal Versus ByRef
Some authors like to say that the ByVal keyword is overloaded for strings, meaning that it takes on a different meaning when applied to strings than when applied to other variables. Frankly, I don't see it. Writing:
ByVal str As String
tells VB to pass the contents of the BSTR (actually the ABSTR), which is the pointer to the character array. Thus, ByVal is acting normally--it just happens that the content of the BSTR is a pointer to another object, so this simulates a pass by reference. Similarly:
ByRef str As String
passes the address of the BSTR, as expected.
StrPtr
Strings in Visual Basic are stored as BSTR's. If you use the VarPtr on a variable of type String, you will get the address of the BSTR, which is a pointer to a pointer of the string. To get the address of the string buffer itself, you need to use the StrPtr function. This function returns the address of the first character of the string. Take into account that Strings are stored as UNICODE in Visual Basic.
To get the address of the first character of a String, pass the String variable to the StrPtr function.
Example:
Dim lngCharAddress as Long
Dim strMyVariable as String
strMyVariable = "Some String"
lngCharAddress = StrPtr(strMyVariable)You can use this function when you need to pass a pointer to a UNIOCODE string to an API call.
VarPtr
不是 VBA/VB6 语言的一部分,因此实现 VBA(如 Corel)的公司可能不会在他们的 VBA 中实现它。 VBA 规范在这里
https://msdn.microsoft.com/en-us/library/dd361851.aspx
关于vb6 - 为什么 VarPtr(ByVal str) 的结果与 StrPtr(str) 相同? (VB6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47499525/
我有以下代码: Sub AddValidation() Dim ws, wsDefinitions As Worksheet Set ws = ThisWorkbook.Worksheet
我想我最近(终于)开始掌握 ByVal 和 ByRef 在 VBA 中的工作方式。 观察结果 在我迄今为止读过的所有教程和引用文献中,ByRef 始终是“传递对象”,ByVal 是“传递对象的副本”
我正在从 Excel 电子表格中导出多个 INI 文件,其中一行表示一个 INI 文件,INI 部分和键是列。到目前为止,这工作得很好,除了似乎 VBA 正在传递字典 ByRef (?),但让我解释一
我在 Access 2013 中使用 VBA。 在常规模块中有 2 个过程,RunProc() 和 PopulateCollection() 当执行RunProc时,它会调用PopulateColle
我认为我遗漏了一些关于数据表如何工作的基本知识。以下过程以 GetData 开头,引入what作为填充的数据表。以下代码所做的全部工作是传递数据表的副本,对其进行操作,然后返回它: Sub GetDa
我认为我遗漏了有关 DataTables 工作原理的一些基本知识。以下过程以 GetData 开始,将 what 作为填充的 DataTable 引入。以下所有代码所做的就是传递数据表的副本,对其进行
我正在观看一些关于 Nodejs 的介绍类型视频。我遇到了一个我想出来的问题,但我想了解“为什么”。这是有问题的原始代码: var http = require("http"); va
我正在 VBA 上制作一个宏,该宏附加到 excel 中的数据验证列表。当从列表中选择某个选项时,我希望它运行分配给该选择的宏。但是我反复收到错误“编译错误。参数不是可选的。我知道我需要在调用宏后添加
我不需要这个声明,因为它只会使我的代码变得庞大且不可读。 有没有办法让 Visual Studio (VS) 不自动添加它。每次我删除它时,它都会被 VS 添加回来。 Function DoStuff
有什么不同?我总是使用 ByVal,但是,我真的不知道什么时候应该什么时候不应该...... 最佳答案 ByRef = 你给你的 friend 你的学期论文(原件),他会做标记并可以退还给你。ByVa
在 ByRef 和 ByVal 之间进行选择时需要考虑哪些事项。 我理解两者之间的区别,但我不完全理解 ByRef 是否节省资源,或者我们是否需要在 .Net 环境中担心这一点。 如果功能在某种情况下
ByRef 与 ByVal 会生成错误!? 我有一个使用对象的方法 Function Foo(ByRef bar as CustomObject) as Boolean 此方法生成错误,因为一些奇怪的
我尝试尝试 JaredPar ByRef vs ByVal Clarification 回答的问题 ByVal in VB.NET means that a copy of the provided
当我进行提取方法重构时,ReSharper 总是想把 ByVal 修饰符放在任何地方。不再需要显式放置 ByVal 并且 Visual Studio 本身 doesn't do that anymor
我正在从 asp.net 应用程序调用一个 dll(用 vb6 编写)。我正在调用 dll 的以下函数: Public Function FamIdentify_BYTE(strName As Str
我正在学习 C++ 在线类(class) (Pluralsight.com),并在模板上进行练习,特别是将实际数字(例如 3 )传递给需要 (T& t) 的模板。 . 讲师编写的代码无法在我的 PC
我正在使用第三方 C++ dll,它使用具有以下签名的函数: extern "C" __declspec(dllimport) int __stdcall CalcDDtable(struct ddT
我知道 C# 中的默认值是 ByVal。我在很多地方使用了相同的变量名,然后我注意到传递的值发生变化并返回。我想我知道 C# 的作用域机制是错误的。这里公共(public) license 覆盖本地
在 VB.NET 中,用于方法参数更快,ByVal或 ByRef ? 此外,哪个在运行时(RAM)消耗更多资源? 我通读了this question ,但答案不适用或不够具体。 最佳答案 Byval
我正在使用事件处理程序,如果选择一个或两个单元格,我会运行某些事件。我遇到的问题是,当选择两个单元格时,我不知道如何访问第二个单元格的属性(即它的值是什么)。知道如何访问所选的第二个单元格的值(我希望
我是一名优秀的程序员,十分优秀!