Vb6 全局函数是否有一个CallByName等价物?

Vb6 全局函数是否有一个CallByName等价物?,vb6,Vb6,我想这样做:“如果有一个模块X包含一个函数Y,那么调用它,否则不要调用。” 我知道我可以使用CallByName(Object,MethodName,…)调用对象实例的方法或属性 是否可以调用未绑定到对象的全局子/函数 //Module1 Public Sub DoSomething End Sub //Module2 Public Sub TriggerDoSomething On Error Resume Next CallByName2 "Module1", "DoSomethi

我想这样做:“如果有一个模块X包含一个函数Y,那么调用它,否则不要调用。”

我知道我可以使用
CallByName(Object,MethodName,…)
调用对象实例的方法或属性

是否可以调用未绑定到对象的全局子/函数

//Module1
Public Sub DoSomething
End Sub

//Module2
Public Sub TriggerDoSomething
  On Error Resume Next
  CallByName2 "Module1", "DoSomething", ...
End Sub

我知道,最好重构我的代码,将DoSomething包装成一个类,但目前这是不可能的,因为它会以一种无法在几个小时内修复的方式破坏我同事的代码。

条件编译可以解决您的问题吗

//Module2
Public Sub TriggerDoSomething
    #If DoSomething_IsPresent Then
        DoSomething
    #End if
End Sub
然后在项目设置中添加以下条件编译参数:

  • 如果存在DoSomething:DoSomething_IsPresent=-1
  • 如果DoSomething不存在:DoSomething_IsPresent=0

顺便说一句,请注意以下内容中的“错误恢复下一步”:


如果模块1中存在DoSomething,但有一个未处理的错误,您不会注意到它。

调用一个类确实会更容易-您不能用一个将调用重定向到模块的类包装模块吗

可以使用FunctionDelegator按名称调用模块中的例程。Matt Curland的优秀著作对此进行了解释

谷歌搜索可能会发现一些使用CallWindowProc的黑客,但马特·科兰德说这很危险。这几乎是这件事的最终结论:)



编辑:RS Conley的答案不使用模块,使用具有GlobalMultiUse实例属性的类,您将能够使用CallByName。如果您的代码位于DLL而不是EXE中,这将起作用。RS Conley建议,在任何情况下,在DLL中使用几乎所有功能的最小EXE都更为灵活:这很可能是真的。

不要使用模块,使用具有实例属性GlobalMultiUse的类,您将能够使用CallbyName

。 我接受捐款

Public Sub callbyname2(proc As String)
    Dim vbComp As VBComponent
     For Each vbComp In ActiveWorkbook.VBProject.VBComponents
        On Error Resume Next
        Application.Run (vbComp.name & "." & proc)
        If Err.Number <> 1004 Then
            Exit For
        End If
    Next
End Sub
Public Sub callbyname2(proc As String)
作为VBComponent的Dim vbComp
对于ActiveWorkbook.VBProject.VBComponents中的每个vbComp
出错时继续下一步
Application.Run(vbComp.name&“&proc)
如果错误号为1004,则
退出
如果结束
下一个
端接头

好主意。这不需要将类移动到DLL项目吗?您可以这样做&它不会破坏模块的客户机代码。我不能让它在EXE中工作。(必须更改为ActiveX exe,甚至将类设置为GlobalMultiUse。)如果类驻留在exe中,请更正。我很少再这样做了,我更喜欢有一个最小的EXE链接到一个DLL。那样会更灵活。你可能是对的。也许你应该编辑答案来解释这一点?DR可能还没有DLL中的代码。顺便说一句,如果你没有反对意见,我将编辑我的答案,包括你的想法。如果你想让我把它拿出来,请留下评论。我对你的答案有+1。没问题。所有这些的要点是得到正确的答案。太好了!顺便说一句,我浏览了你的一些其他答案。我喜欢你的VB6应用程序结构的声音,我希望我们的传统应用程序能像那样整洁。不幸的是,我们很少更改它们,因此它们的改进非常缓慢。如果我没记错的话,“ActiveWorkbook”是Excel对象模型的一部分。那么,这不是VBA代码,而是VB6代码吗?当然。但是如果你不必使用excel/office,我想你真的不应该使用VB
Public Sub callbyname2(proc As String)
    Dim vbComp As VBComponent
     For Each vbComp In ActiveWorkbook.VBProject.VBComponents
        On Error Resume Next
        Application.Run (vbComp.name & "." & proc)
        If Err.Number <> 1004 Then
            Exit For
        End If
    Next
End Sub