停止从DLL执行VBA

时间:2018-06-05 22:42:22

标签: vb.net vba excel-vba excel

在将Excel VBA应用程序转换为VB.NET的过程中,我理解我不能在DLL中使用End语句,因为它只能由启动它的进程停止。相反,似乎DLL必须引发一个由Excel中的VBA代码处理的事件。

我认为大部分工作除了应该检测到引发事件的部分,以便中止执行。这是我到目前为止所得到的:

VBA调用的DLL程序:

Public Class Class1
    Sub DLLentry()
        Dim ClStop As New ClassStop
        AddHandler StopExecution, AddressOf ClStop.stopExec
        DLLprocedure1()
    End Sub
End Class

执行大部分操作的过程:

Module Module1
    Public Event StopExecution()
    Sub DLLprocedure1()
        'Operations that in certain circumstances must stop the execution
        RaiseEvent StopExecution()
    End Sub
End Module

应该将引发的事件通告给Excel的类:

Imports System.Runtime.InteropServices

<ComVisible(True)>
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>
<Guid("28C7DCE1-90EF-4a30-AF7F-4187F9FFFDEB")>
Public Interface ICoreEvents
    <DispId(1)>
    Sub StopExecutionCl()
End Interface

<ComVisible(True)>
<InterfaceType(ComInterfaceType.InterfaceIsDual)>
<Guid("86CE5E8D-777D-4cd5-8A7D-7F58737F1DB4")>
Public Interface ICore
    Sub stopExec()
End Interface

<ComVisible(True)>
<ClassInterface(ClassInterfaceType.None)>
<ComDefaultInterface(GetType(ICore))>
<ComSourceInterfaces(GetType(ICoreEvents))>
<Guid("C58721B1-15B3-4eeb-9E1E-BCDA33D38EE6")>
Public Class ClassStop
    Implements ICore
    <ComVisible(False)>
    Public Delegate Sub OnStopExecutionCl()
    Public Event StopExecutionCl As OnStopExecutionCl
    Sub stopExec() Implements ICore.stopExec
        MsgBox("Checkpoint 1")
        RaiseEvent StopExecutionCl()
    End Sub
End Class

在Excel的VBA中,我在程序中有一个模块开始执行:

Sub StartingProcedure()
    Dim oMyApp1 As New Class1
    Call oMyApp1.activateEvent

    Dim oMyApp2 As New DLLname.Class1
    Call oMyApp2.DLLentry
End Sub

应该捕获事件并停止执行的类模块:

Public WithEvents cls1 As DLLname.ClassStop

Private Sub cls1_StopExecutionCl()
    MsgBox "Checkpoint 2"
    End
End Sub

Public Sub activateEvent()
    Set cls1 = New DLLname.ClassStop
End Sub

DLL&#34; DLLname.dll&#34;注册为COM并在Excel中引用。我知道DLL中的事件声明已被Excel正确检测,因为我可以从类模块的下拉菜单中选择它。

问题在于,即使&#34; Checkpoint 1&#34;达到几次(事件被提出),&#34;检查站2&#34;没有达到。

我错过了什么?这是完成我想要的最佳方式吗?

P.S。我不确定,但是我不能压制Guid定义和Interface ICore

1 个答案:

答案 0 :(得分:0)

在评论中使用@Tim Williams指导实现了工作代码。

在DLL中:

User

在一个模块中:

Imports System.Runtime.InteropServices

<ComVisible(True)>
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>
<Guid("28C7DCE1-90EF-4a30-AF7F-4187F9FFFDEB")>
Public Interface ICoreEvents
    <DispId(1)>
    Sub StopExecutionCl()
End Interface

<ComVisible(True)>
<InterfaceType(ComInterfaceType.InterfaceIsDual)>
<Guid("86CE5E8D-777D-4cd5-8A7D-7F58737F1DB4")>
Public Interface ICore
    Sub DLLentry()
End Interface

<ComVisible(True)>
<ClassInterface(ClassInterfaceType.None)>
<ComDefaultInterface(GetType(ICore))>
<ComSourceInterfaces(GetType(ICoreEvents))>
<Guid("C58721B1-15B3-4eeb-9E1E-BCDA33D38EE6")>
Public Class Class1
    Implements ICore
    Public Event StopExecutionCl()

    Sub stopExec()
        MsgBox("Checkpoint 1")
        RaiseEvent StopExecutionCl()
    End Sub

Sub DLLentry() Implements ICore.DLLentry
        AddHandler StopExecution, AddressOf stopExec
        DLLprocedure1()
    End Sub
End Class

在Excel的VBA中 - 类模块Module Module1 Public Event StopExecution() Sub DLLprocedure1() 'Operations that in certain circumstances must stop the execution RaiseEvent StopExecution() End Sub End Module

Class1

在一个模块中:

Public WithEvents cls1 As DLLname.Class1

Private Sub cls1_StopExecutionCl()
    MsgBox "Checkpoint 2"
    End
End Sub