很奇怪的一个问题,通过CallByName调用COM组件时自定义的错误总是变成了Automation错误,谁知道就说一声,谢了。

解决方案 »

  1.   

    不知道不用CallByName调用,用正常方式调用试试,先确定看是Com组件的问题,还是调用的问题
      

  2.   

    正常的方式没问题,可是我必须要利用CallByName可以在运行时动态调用的特性。
      

  3.   

    我把CallByName包装了一下,如Public Function CallX(ByVal ObjectName As String, ByVal ProcName As String, ParamArray Args() As Variant) As Variant    Dim intArgs     As Integer
        Dim objTmp      As Object
        
        Set objTmp = CreateObject(ObjectName)
        
        intArgs = UBound(Args) + 1    Select Case intArgs
            Case 0
                CallX = CallByName(ObjectName, ProcName, VbMethod)
            Case 1
                CallX = CallByName(ObjectName, ProcName, VbMethod, Args(0))
            Case 2
                CallX = CallByName(ObjectName, ProcName, VbMethod, Args(0), Args(1))
            '...
        
        End Select
     
    End Function'调用
    xValue=Callx("TestLib.TestObject","Test",Arg1,Arg2...)假如当"TestLib.TestObject"对象中有自定义的错误时,返回到CallX函数中的错误都成了Automation错误,系统错误不变。
      

  4.   

    问题应该出在这一句Set objTmp = CreateObject(ObjectName)改为:Set objTmp = Controls(ObjectName)
      

  5.   

    没看到你的代码中用到  objTmp ,定义它作什么用呀
      

  6.   

    hoho,不好意思我写错了,是CallX=CallByName(objTmp,ProcName,Arg...)
      

  7.   

    调用的是COM组件不是控件,不能使用Controls集合,谢谢。
      

  8.   

    调用的是Com组件,感觉 Set objTmp = CreateObject(ObjectName) 这句没问题哦为了测试看是不是这句的问题,你把它直接替换为 Set objTmp = CreateObject(TestLib.TestObject) 试试
      

  9.   

    今天上班把问题解决了,是CallByName本身的缺陷,没办法避免,我改用了TLB库提供的InvokeHook方法,谢谢各位热情相助。