此问题与 Kenny Kerr 在“Excel RTD 服务器:C# 接口”上的博文有关,该博文可在此处找到,它应该允许您构建 Excel RTD 服务器,而无需包含对任何特定 Excel 类型库的引用;必须包含引用使您的 RTD 服务器 Excel 版本特定(我相信向前兼容,但不向后兼容)。不依赖 Excel 类型库可简化将 RTD 部署到具有不同 Excel 版本(XP、2003、2007 和 2010)的机器上。
现在,没有 RTD 引用特定的 Excel 类型库来获取接口 IRtdServer 和 IRTDUpdateEvent 是非常好的。但我正忙着让肯尼的建议奏效。
这是我所做的:
1) Added IRtdServer.cs and IRTDUpdateEvent.cs to my RTD project and put the interface definitions from your blog into those files (not changing the GUIDs).
2) Removed any reference to an Excel type library.
3) Build and regasm OK.
我在 VBA 和 VBScript 中有小型测试工具,通过模拟 Excel 对 RTD 的调用来测试我的 MyRTD.dll RTD 服务器。以下是相关的代码片段:
第一个VBA:
Const RTDProgID As String = "MyRTD.RTD"
Const UpdateEventProgID As String = "MyRTD.UpdateEvent"
' Create the RTD server object.
Dim rtd As Object
Set rtd = CreateObject(RTDProgID)
' Start the RTD server, passing in a callback object.
Dim callback As Object
Set callback = CreateObject(UpdateEventProgID)
Dim status As Long
status = rtd.ServerStart(callback) <---- Fails here.
此代码在最后一行失败,消息为“无法将 MyRTD.UpdateEvent 转换为 MyRTD.IRTDUpdateEvent”。虽然类 UpdateEvent 实现了接口 IRTDUpdateEvent。
第二个VBScript:
' ProgIDs for COM components.
Const RTDProgID = "MyRTD.RTD"
Const UpdateEventProgID = "MyRTD.UpdateEvent"
' Real-time data (RTD) object
Dim rtd
Set rtd = CreateObject(rtdID)
' Callback object. This is how
' the RTD would notify Excel of
' new data updates.
Dim callback
Set callback = CreateObject(UpdateEventProgID)
' Start the RTD server, passing in
' the callback object.
Dim status
status = rtd.ServerStart(callback) <---- Fails here.
此代码在最后一行失败,消息沿“无效的过程调用或参数”行(我假设回调的结果是错误的类型/接口)。
任何帮助,将不胜感激。
Best regards, Andrew Sheppard