如何创建一个组件,使VBA可以访问我自己运行的应用程序?

时间:2017-01-14 15:12:38

标签: c# vb.net vba com

我很抱歉,但我根本就不知道这里的术语。我不是在寻找一个完整的解决方案,只是帮助搜索什么技术或者如果可能的话教程。

我有一个.NET应用程序,我想让VBA访问我当前运行的应用程序实例。换句话说,我想创建类似的访问我的应用程序,就像Microsoft对运行的Office Word或Excel实例一样。

我可以创建一个COM可见的.dll,VBA可以使用它,但现在我想让它使用我当前运行的应用程序。

2 个答案:

答案 0 :(得分:3)

您正在寻找一个进程外COM服务器,它在一个单独的进程中运行。这允许客户端附加到已运行的应用程序实例。有关示例,请查看this教程。

答案 1 :(得分:1)

我确实只是要求我想要的术语,但我在VB.NET中找到的信息非常少。

示例given above by Aurora from MS是一个进程外COM服务器的示例,您只能在VBA中调用CreateObject。您无法调用getobject,因为此示例未向运行对象表(ROT)添加必要的信息。

这意味着如果要访问已在运行的应用程序,则无法使用此示例。

要解决此问题,您需要在VBSimpleObject的实例上调用RegisterActiveObject以将您的类添加到ROT。我在VB.NET中找不到可靠的WinAPI签名,所以这里是注册和撤销签名

 <DllImport("oleaut32.dll")> _
Public Shared Function RegisterActiveObject(<MarshalAs(UnmanagedType.IUnknown)> ByVal pUnk As Object, _
                                            ByRef rclsid As Guid, ByVal dwFlags As IntPtr, _
                                            <Out()> ByRef lpdwRegister As UInt32) As Integer
End Function

<DllImport("oleaut32.dll")> _
Public Shared Function RevokeActiveObject(ByVal dwRegister As UInt32, ByVal reserved As IntPtr) As Integer
End Function

这些工作让我希望他们是对的。

现在可能有关于引用计数和何时调用撤销的事情,但我现在可以调用GetObject。