如何创建一个组件,使 VBA 能够访问我自己正在运行的应用程序



抱歉,我根本不知道这里的术语。 我不是在寻找完整的解决方案,只是帮助搜索哪些技术或教程(如果可能的话)。

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

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

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

我确实只要求我想要的术语,但我在 VB.NET 中发现这方面的信息很少。

上面来自MS的Aurora给出的示例是一个进程外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。

相关内容

最新更新