【问题标题】:Is it possible to use the same RTDServer in multiple excel instances是否可以在多个 excel 实例中使用相同的 RTDServer
【发布时间】:2013-03-05 09:54:14
【问题描述】:

我有一个 C# RTDServer,它在一个 excel 实例中运行良好。定义如下:

[Guid("1D50EF28-A1BE-4BE9-9214-46A48085ADFF")]
[ProgId("Acme.RtdServer")]
public class RTDServer : IRtdServer
{
   // IRtdServer members:
   // ...
}

当服务器“连接”时 excel 调用

#region IRtdServer Members    
public int ServerStart(IRTDUpdateEvent CallbackObject)
{
    _callback = CallbackObject;
}

带有一个回调对象,此后可用于通知 excel 可以收集更新:

_callback.UpdateNotify();

问题是,如果我有第二个、第三个等 excel 实例,则永远不会调用 ServerStart,这意味着我无法通知 excel 新更新已准备好。 MS 知识库文章 here 建议进程外 RTDServer 的类似行为。 我的实现是一个线程化的进程内 RTDServer。

我希望能够跨多个实例使用同一服务器 Acme.RtdServer。这一定是可能的,因为 Bloomberg Excel API 似乎可以实现它。有谁知道这是如何实现的?

编辑:对 RTD() 的调用包装在 UDF 中:

public object ACME_UDF(string ItemID, string TopicName, bool OtherData = false)
{
    if (string.IsNullOrEmpty(ItemID) || string.IsNullOrEmpty(TopicName))
    return "...";

    try
    {
        return _xlApp.WorksheetFunction.RTD("acme.rtdserver", null, ItemID, TopicName, OtherData); 
    }
    catch (Exception)
    {
        return "Failed to retrieve [" + ItemID + "] with [" + TopicName + "]";
    }
}

谢谢

【问题讨论】:

  • 加载 InProc COM 服务器的进程之间应该没有干扰。您确定您有不同的 Excel 实例(任务管理器中的不同进程),而不仅仅是同一进程的不同窗口吗?
  • 是的,我可以在进程资源管理器中看到两者。我无法弄清楚附加进程是如何知道第一个进程调用了 ServerStart(...) 的。
  • 这可能与正在注册的 GUID 以及其他 excel 实例意识到这一点有关吗?
  • 我有一个 RTD 服务器,可以在不同的情况下正常工作。您的 RTD 服务器/Excel 必须是特殊的。您的 COM 对象是否在第二个实例中被激活?您是否尝试过使用非常简单的 RTD 服务器?
  • 谢谢,Govert。我已经测试了一个简单的 rtdserver,它适用于多个实例。一定是别的东西。

标签: excel c#-4.0 real-time com-interop rtd


【解决方案1】:

[似乎无法添加任何 cmets。当我尝试时,它显示“还有 11 个...”] 版本是 2010 年,32 位

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 2018-01-29
    • 2020-05-17
    • 2018-04-23
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多