Эта проблема связана с сообщением Кенни Керра в блоге «Серверы RTD Excel: интерфейсы C #», которое можно найти здесь , которое должно позволить вам создать сервер RTD Excel без включения ссылки в любую конкретную библиотеку типов 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, которые тестируют мой RTD-сервер MyRTD.dll, эмулируя вызовы, сделанные Excel к 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