如何从MFC DLL中获取与COM包裹的C#对象的接口



我在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 %dn", ret);
    // Uninitialize COM.
    CoUninitialize();
    return (ret == VARIANT_TRUE) ? TRUE : FALSE;
}

一段时间后,我以完全相同的方式调用另一个方法stetimeFormat。问题是,每当我以这种方式调用我实例化新的C#对象,但实际上,我正在尝试达到第一次创建的对象,而只是将其属性之一设置为另一个值。

问题似乎在这一行中:

IForwarderPtr pIFwd(__uuidof(MyForwarder));

那么,如何将接口到相同的C#对象而不是创建新的接口?

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

实际上,该行有两件事。它创建了其uuid/classID为 MyForwarder and 的com对象。将结果存储在 pIFwd

如果您每次不想创建它,请尝试以下操作:

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

您可以将以下语句移至构造函数

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

&deStructor的语句 counitialize()。添加 iforwardptr 作为类的成员变量。

这样,您将能够重新使用同一实例。

最新更新