Я создаю инструмент в C# для получения сообщений CAN-сети (сеть в автомобиле) с использованием Dll, написанной на C/C++. Эта DLL может использоваться как COM-интерфейс.QueryInterface не удается выполнить литье внутри реализации COM-интерфейса
My C# -formclass реализует один из этих COM-интерфейсов. И другие переменные создаются с использованием этих COM-интерфейсов (все работает отлично).
Проблема: Интерфейс моих инструментов C# -form имеет 3 абстрактные функции. Одна из этих функций называется - dll - и мне нужно реализовать ее самостоятельно. В этой функции я хочу получить свойство переменной формы, имеющей тип COM.
библиотека СОМ имеет CANSUPPORTLib
Формы для всей переменные:
private CANSUPPORTLib.ICanIOEx devices = new CANSUPPORTLib.CanIO();
Этих переменный также формы ширины и извлекаются с помощью устройств переменных:
canreceiver = (CANSUPPORTLib.IDirectCAN2)devices.get_DirectDispatch(receiverLogicalChannel);
функция, которая вызывается dll и реализована в C#
public void Message(double dTimeStamp)
{
Console.WriteLine("!!! message ontvangen !!!" + Environment.NewLine);
try
{
CANSUPPORTLib.can_msg_tag message = new CANSUPPORTLib.can_msg_tag();
message = (CANSUPPORTLib.can_msg_tag)System.Runtime.InteropServices.Marshal.PtrToStructure(canreceiver.RawMessage, message.GetType());
for (int i = 0; i < message.data.Length; i++)
{
Console.WriteLine("byte " + i + ": " + message.data[i]);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
Ошибка поднимается на этой линии:
message = (CANSUPPORTLib.can_msg_tag)System.Runtime.InteropServices.Marshal.PtrToStructure(canreceiver.RawMessage, message.GetType());
Ошибка:
Unable to cast COM object of type 'System.__ComObject' to interface type CANSUPPORTLib.IDirectCAN2'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{33373EFC-DB42-48C4-A719-3730B7F228B5}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
Примечания: Вполне возможно, иметь таймер-часы, который проверяет каждые 100 мс для сообщения мне нужно. Затем сообщение извлекается точно так же, как и сейчас. Этот таймер запускается при запуске формы. Проверка выполняется только тогда, когда Message (double) поставил переменную в true (сообщение появилось).
Когда таймер-часы запускается в функции сообщения, я иметь такую же ошибку, как выше
Начиная другой поток при запуске формы, также не представляется возможным.
Есть ли у кого-нибудь опыт работы с COM-interop?
Когда таймер
Что меня озадачивает, так это может произойти при передаче результата вызова get_DirectDispatch, а не при вызове PtrToStructure. Вы уверены в строке, вызывающей ошибку? – Timores
Я уверенно верю в это. В другой функции я отправляю сообщение и через DLL-функции, улавливая уведомление и получая сообщение.При отладке функции send() я могу отлично получить доступ к переменной canreceiver и увидеть значение RawMessage, но не пока я в функции Message() (-> это реализация COM-интерфейса – brecht