【问题标题】:How to get interface to C# object wrapped in COM, from MFC DLL如何从 MFC DLL 获取封装在 COM 中的 C# 对象的接口
【发布时间】:2017-11-27 03:54:14
【问题描述】:

我在 DLL 中有 C# 对象。 我通过 MFC DLL 中的 COM 调用此对象的方法。像这样:

BOOL CForwarder::InitMyManagedFlex()
{
    // Initialize COM.
    HRESULT hr = CoInitialize(NULL);

    // Create the interface pointer.
    IForwarderPtr pIFwd(__uuidof(MyForwarder));

    long lResult = 0;
    VARIANT_BOOL ret = FALSE;
    BSTR bstr = AsciiToBSTR("AAA");

    // Call the Add method.
    pIFwd->Start(bstr, &ret);

    SysFreeString(bstr);

    wprintf(L"The result is %d\n", ret);

    // Uninitialize COM.
    CoUninitialize();

    return (ret == VARIANT_TRUE) ? TRUE : FALSE;
}

过了一会儿,我以完全相同的方式调用另一个方法 SetTimeFormat。 问题是,每次我以这种方式调用时,我都会实例化一个新的 C# 对象,但实际上我试图访问第一次创建的同一个对象,并将它的一个属性设置为不同的值。

问题似乎出在这一行:

IForwarderPtr pIFwd(__uuidof(MyForwarder));

那么我如何获得同一个 C# 对象的接口而不是创建一个新对象呢?

【问题讨论】:

    标签: c# c++ interface com


    【解决方案1】:
    // Create the interface pointer.
    IForwarderPtr pIFwd(__uuidof(MyForwarder));
    

    实际上,这条线做了两件事。它创建 UUID/ClassID 为 MyForwarder 的 COM 对象将结果存储在 pIFwd

    如果你不想每次都创建它,试试这个:

    IForwarderPtr pIFwd(__uuidof(MyForwarder));
    pIFwd->Start(bstr, &ret);
    .
    .
    .
    .
    pIFwd->SetTimeFormat (....)
    
    .
    .
    .
    SysFreeString(bstr);
    
    wprintf(L"The result is %d\n", ret);
    
    // Uninitialize COM.
    CoUninitialize();
    

    【讨论】:

    • 我知道 - 但正如我所提到的,SetTimeFormat 是作为与 MFC DLL 完全分离的调用而来的
    • @LeonHavin 然后将其粘贴到班级成员/全局或其他内容中
    【解决方案2】:

    您可以将以下语句移动到您的构造函数中

    HRESULT hr = CoInitialize(NULL);
    _pIFwd(__uuidof(MyForwarder)); //where _pIFwd is a member variable of your class
    

    & 声明 CoUninitialize() 到你的析构函数。 添加 IForwardPtr 作为类的成员变量。

    这样您就可以重复使用同一个实例。

    【讨论】:

    • 当我把它移到构造函数 pIFwd(__uuidof(MyFlexForwarder));并且还使 IFlexForwarderPtr pIFwd 成为一个类的成员,然后它说:“错误 - 调用一个类类型的对象,没有适当的运算符 () 或转换函数到函数指针类型”
    • 另外,如果我在构造函数中添加 IForwarderPtr pIFwd(__uuidof(MyForwarder)); mpIFwd = pIFwd 然后将 IForwarderPtr mpIFwd 添加为类的成员,然后它将代码中每次出现的 mpIFwd 声明为未声明的标识符...
    • 你有 IForwarderPtr 接口的头文件吗?
    • 在 CForwarder 头文件中使用前向声明 class IFowarderPtr;。将你的成员变量声明为IFowarderPtr *mPIFwd;
    • 我有 Forwarder.h,这就是我声明 IForwarderPtr mpIFwd 的地方,并且在此之前声明了 IForwarderPtr 类。但随后在 Forwarder.cpp 中(也存在 IForwarder 定义和实现,任何出现的 mpIFwd 都被标记为未知标识符...
    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 2020-12-09
    • 2017-05-22
    • 2017-11-25
    • 2012-04-26
    • 2010-11-18
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多