0
我有一个C#RTDServer,在excel的一个实例中运行良好。它被定义为如下:是否有可能在多个excel实例中使用相同的RTDServer
[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 KB文章here为进程外RTDServers提出了类似的行为。 我的实现是一个线程化的进程中的RTDServer。
我希望能够跨多个实例使用相同的服务器Acme.RtdServer
。由于彭博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实例(任务管理器中的不同进程),而不仅仅是同一进程的不同窗口吗? – Govert 2013-03-05 12:26:07
是的,我可以在进程资源管理器中看到。我无法弄清楚附加过程似乎知道ServerStart(...)已被第一个调用。 – 2013-03-05 15:32:32
难道这与注册的GUID和Excel的其他实例知道这一点有关吗? – 2013-03-05 15:41:22