在我的程序中声明了这样一个函数:
Declare Function EbExecuteLine Lib "VBA6.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As LongPublic Function ELine(sCode As String, Optional fCheckOnly As Boolean) As Boolean
   ELine = EbExecuteLine(StrPtr(sCode), 0&, 0&, Abs(fCheckOnly)) = 0
End Function我在程序里用来加载窗体用的,就是给出窗体的名字,根据名字来动态加载已经存在但是尚未成为实例的窗体,比如这样:
ELine("Frm1.Show")问题在于调试环境中可以正常运行,但是编译之后,就会报错,找不到VBA6.dll,后来我copy这个文件到system32目录下面,又报错某某内存不能为读,我怀疑是不是没有正常注册,用regsvr32 vba6.dll进行注册,报告:“已加载vba6.dll,但没有找到DllRegisterServer输入点,无法注册这个文件。”然而根据窗体名字来动态加载窗体是我整个程序的运行基础啊,总不能让客户挂着VB的开发环境来用吧?各位大侠,如何解决这个问题?或者可以实现同样效果的方式也可以!

解决方案 »

  1.   

    看个例子,先! 
    我在本机上运行通过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)) = 0
    End Function
    Private Sub Combo1_Click()
       Text1 = Combo1.Text
    End Sub
    Private Sub Command1_Click()
        Dim res As Boolean
        res = ExecuteLine(Text1.Text)
    End Sub
    Private Sub Form_Load()
        Combo1.AddItem "Var = msgbox(" & Chr$(34) & "¿´µ½ÁË£¿ºÜºÃÓá£" & Chr$(34) & " &  vbCrLf & " & Chr$(34) & "ÊÇ·ñ¼ÌÐøʵÑé?" & Chr$(34) & ", vbYesNo + vbInformation)" & ":" & "If var = vbNo Then End"
        Combo1.AddItem "shell " & Chr$(34) & "calc.exe" & Chr$(34) & ",vbNormalFocus"
        Combo1.AddItem "msgbox SecretFunction(2,2),vbInformation"
        Combo1.AddItem "Form1.BackColor = vbRed"
        Combo1.AddItem "var = 3^2 + sin(3.1415926/4):msgbox var"
        Combo1.ListIndex = 0
    End Sub
      

  2.   

    估计是操作系统当前环境和这个API不匹配的问题,看看这里,有不同情况的解释
    http://www.shadoware.de/vb/execute_string.html
      

  3.   

    回路人:你没有仔细看题
    回3661512(.Net):好像是德语的页面吧?实在无法看懂……我下载了页面上VB6的例子,同样也是只能在调试状态下运行,编译后还是报错。
      

  4.   

    另外楼上的代码,编译成EXE文件以后依然存在这个问题..运行时错误531,vba.dll文件未找到,
    我给你的地址上面有两个这个函数的示范,你下下来看看行不行,也可以试试编译成P-CODE看看
      

  5.   

    http://www.vb-helper.com/howto_execute_line.html
    这个是英文的,不过我试了一下那个代码,也出现read错误,我在想会不会是系统本身不支持...
    你换用vba5.dll的申明试试?
      

  6.   

    是存在这个问题,解决办法:
    '首先引用 Microsoft Script Control
    Private Sub Command1_Click()
        Dim SC As New ScriptControl
        SC.Language = "VBscript"
        SC.AddObject "form2", Form2
        SC.ExecuteStatement "form2.show"
        Set SC = Nothing
    End Sub
      

  7.   

    你可以通过一个变通的方法创建窗体:Private Function ShowNamedForm(strForm As String) As Form
        Dim frmTemp As Form
        Set frmTemp = Forms.Add(strForm)
        frmTemp.Show
        Set ShowNamedForm = frmTemp
    End Function
      

  8.   

    参考一下这个帖子,跟你一样的情况:
    http://www.tek-tips.com/gviewthread.cfm/lev2/4/lev3/32/pid/711/qid/97332
      

  9.   

    同意楼上,转换成具体代码就是:Option ExplicitPrivate Function ShowNamedForm(strForm As String) As Form
        Dim frmTemp As Form
        Set frmTemp = Forms.Add(strForm)
        frmTemp.Show
        Set ShowNamedForm = frmTemp
    End FunctionPrivate Sub Command1_Click()
    ShowNamedForm Text1
    End SubPrivate Sub Form_Load()
    Text1 = "Form2"
    End Sub
    没有EbExecuteLine功能那么大,但是可以满足你的要求了
      

  10.   

    帖子是看了,但是没太看明白....楼上的星星能具体解释一下吗?why?
      

  11.   

    to passer_wave:
    Forms 集合是一个集合,它的元素代表每一个在应用程序中加载的窗体。集合包括应用程序的 MDI 窗体,MDI 子窗体和非 MDI 窗体。Forms 集合只有一个属性 Count,指定集合中元素的数目。谢谢帮我解答的两位星星^_^