大家见过VB6中的这个函数吗StrPtr(Ptr As String)As Long?对应VB.net中的是哪个函数?

拼命三朗 2005-06-10 04:38:41
Private Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As Long

Private Function ExecuteLine(sCode As String, Optional fCheckOnly As Boolean) As Boolean
ExecuteLine = EbExecuteLine(StrPtr(sCode), 0&, 0&, Abs(fCheckOnly))
End Function

Sub calc(ByVal x As String)
Dim result
Dim oldClipboardText As String
oldClipboardText = Clipboard.GetText
ExecuteLine "dim x as object"
ExecuteLine "x= " & x
ExecuteLine "clipboard.settext x"
result = Clipboard.GetText
Clipboard.SetText oldClipboardText
MsgBox result
Set result = Nothing
End Sub
上述代码是VB6的一段代码,其中出现了StrPtr函数,可查看VB帮助却没有关于此的说明,且VB.net中也找不到此函数,不知哪位同仁用过这个函数?
...全文
813 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
WhiteWizard 2005-06-15
  • 打赏
  • 举报
回复
Public Function VarPtr(ByVal obj As Object) As Integer
Dim GC As System.Runtime.InteropServices.GCHandle = System.Runtime.InteropServices.GCHandle.Alloc(obj, Runtime.InteropServices.GCHandleType.Pinned)
Dim ret As Integer = GC.AddrOfPinnedObject.ToInt32
GC.Free()
Return ret
End Function

Public Function StrPtr(ByVal str As String) As Integer
Dim GC As System.Runtime.InteropServices.GCHandle = System.Runtime.InteropServices.GCHandle.Alloc(str, Runtime.InteropServices.GCHandleType.Pinned)
Dim ret As Integer = GC.AddrOfPinnedObject.ToInt32
GC.Free()
Return ret
End Function


这就是了
其中一个是抄的
一个是照样写的,不知对否
至于哪个是哪个
记不得了
拼命三朗 2005-06-13
  • 打赏
  • 举报
回复
Ninputer(装配脑袋) 的方法的确行,我试过,但是就是太慢,我这里不需对宿主中的对象进行操作与访问,我只要表达式的计算结果。
rzpc(淡蓝色)说的ScriptControl速度是可以,可就是不能解释iif(express,truepart,falsepart)
希望Ninputer(装配脑袋) 能推荐一下快速计算(包括字符串运算、浮点运算)但又能支持逻辑运算和iif函数的方法,谢了
拼命三朗 2005-06-13
  • 打赏
  • 举报
回复
好地好地
daisy8675 2005-06-13
  • 打赏
  • 举报
回复
mark
WhiteWizard 2005-06-13
  • 打赏
  • 举报
回复
我blog上有的
但今天不知怎的上不上去
明天给你带来
一个外国网站上抄来的方法
很简单
淡蓝色2 2005-06-10
  • 打赏
  • 举报
回复
强,没的说
Ninputer 2005-06-10
  • 打赏
  • 举报
回复
CodeDom是全内置的功能,尽管慢,但却可以达到最高的控制力,可动态编译任何代码。
要快速计算表达式,方法多得很呢。
淡蓝色2 2005-06-10
  • 打赏
  • 举报
回复
不是吧,实时计算用ScriptControl不是更方便吗?其速度应该比“反射”更快啊
简单得很,只用一行语句:
[比如计算Sin(0.7)的平方+1]
Dim dblResult = DirectCast(New MSScriptControl.ScriptControl().Eval("Sin(0.7)^2+1"),Double)
Ninputer 2005-06-10
  • 打赏
  • 举报
回复
用法: MsgBox(Calc("1 + 2 + 3"))
Ninputer 2005-06-10
  • 打赏
  • 举报
回复
我给你一个VB.NET实现同样功能的代码吧,还是Calc函数。不用什么StrPtr了

Imports System
Imports System.Text
Imports System.CodeDom.Compiler
Imports Microsoft.VisualBasic
Imports System.Reflection


Public Module Evaluator

Private provider As CodeDomProvider = New VBCodeProvider
Private comp As ICodeCompiler
Private cp As New CompilerParameters()

Public Function Calc(ByVal expression As String) As Object

Dim codeBuilder As New StringBuilder()
Dim mi As MethodInfo

comp = provider.CreateCompiler
codeBuilder.AppendLine("Imports System")
codeBuilder.AppendLine("Imports System.Math")
codeBuilder.AppendLine("Imports Microsoft.VisualBasic")
codeBuilder.AppendLine()
codeBuilder.AppendLine("Public Module Mode")
codeBuilder.AppendLine(" Public Function Func() As Object")
codeBuilder.AppendLine(" Return " + expression)
codeBuilder.AppendLine(" End Function")
codeBuilder.AppendLine("End Module")

cp.ReferencedAssemblies.Add("System.dll")
cp.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
cp.GenerateExecutable = False
cp.GenerateInMemory = True

Dim code As String = codeBuilder.ToString()
Dim cr As CompilerResults = comp.CompileAssemblyFromSource(cp, code)

If cr.Errors.HasErrors Then

Return Nothing

Else
Dim a As Assembly = cr.CompiledAssembly
Dim t As Type = a.GetType("Mode")

mi = t.GetMethod("Func", BindingFlags.Static Or BindingFlags.Public)
Return mi.Invoke(Nothing, New Object() {})
End If
End Function

End Module
Ninputer 2005-06-10
  • 打赏
  • 举报
回复
哇,EbExecuteLine,能用到这个函数的人不简单哪
Ninputer 2005-06-10
  • 打赏
  • 举报
回复
这个是未公开函数,VB6不能传递Unicode字符串给WinAPI,所以才有此函数帮忙。现在VB.NET的可以将Unicode函数按照指针的方式传送给Windows API,就不需要StrPtr了
淡蓝色2 2005-06-10
  • 打赏
  • 举报
回复
那个函数是 取一个字符串变量的内存地址
.net中的变量地址已经没有实际意义,所以vb.net就不支持那个函数了.

由于.net的字符串变量本身就是按引用传递的,你可以试试直接传递字符串.
即:ExecuteLine = EbExecuteLine(sCode, 0, 0, Abs(fCheckOnly))

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧