在COM接口实现内部转换时,QueryInterface失败

时间:2010-03-18 13:09:07

标签: c# com casting queryinterface

我正在使用C / C ++编写的Dll在c#中创建一个工具来检索CAN网络(汽车中的网络)的消息。这个DLL可用作COM接口。

我的c#-formclass实现了其中一个COM接口。其他变量使用这些COM接口进行实例化(一切都很完美)。

问题:我的C#-form实现的接口有3个抽象函数。其中一个函数被称为-dll-我需要自己实现它。在这个函数中,我希望检索一个COM类型的表单范围变量的属性。

COM库是CANSUPPORTLib

表单范围的变量:

private CANSUPPORTLib.ICanIOEx devices = new CANSUPPORTLib.CanIO();

此变量也是表单范围的,并通过devices-variable:

检索
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)).

注意: 可以有一个定时器时钟,每100ms检查一次我需要的消息。然后以与我现在完全相同的方式检索消息。表单启动时启动此计时器。仅当Message(double)将变量设置为true(消息到达)时才进行检查。

当在消息功能中启动定时器时钟时,我有与上面相同的错误

表单启动时启动另一个线程也是不可能的。

是否有人有COM-interop经验?

当这个计时器

1 个答案:

答案 0 :(得分:0)

我想知道是否在与创建Message的线程不同的线程上调用了canreceiver

你知道CANSUPPORTLib.CanIO的线程模型吗?如果它是单元线程的,您可能需要将主UI线程中的引用封送到Message以某种方式调用的线程。

或者,假设您可以更改C ++ dll的源代码,并根据您的其他线程要求和约束,您可以将其更改为自由线程,在这种情况下,可以从多个线程同时访问对象编组。