【发布时间】: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