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

How do I create a component that gives VBA access to my own running Application?

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

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

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

您正在寻找 Out-of-Process COM 服务器,它在单独的进程中运行。这允许客户端附加到您的应用程序的已经 运行 实例。例如,查看 this 教程。

我只是询问了我想要的术语,但我在 VB.NET 中找到的相关信息很少。

示例 given above by Aurora from MS 是 Out-OF-Process COM 服务器的示例,您只能在 VBA 中调用 CreateObject。您不能调用 getobject,因为此示例没有将必要的信息添加到 运行 对象 Table (ROT)。

这意味着如果您想访问已经 运行 的应用程序,则不能使用此示例。

要解决此问题,您需要在 VBSimpleObject 实例上调用 RegisterActiveObject 以将您的 class 添加到 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。