как преобразовать экземпляр com в вариант, чтобы передать его в idispach invoke - PullRequest
0 голосов
/ 16 марта 2019

Я хочу передать экземпляр объекта com в качестве параметра варианта другой активной функции объекта x, для этого мне нужно преобразовать указатель idispatch в вариант? я не уверен.

hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
    if (FAILED(hr))
    { 
        return;
    }
    hr = CLSIDFromProgID(objectName.c_str(), &clsid);
    if (FAILED(hr))
    {
        return;
    }
    hr = CoCreateInstance(clsid, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pApp));
    if (FAILED(hr) || pApp == nullptr) {
        return;
    }

это код создания экземпляра, после чего я использую это:

VARIANT v;
    VariantInit(&v);
    v.pdispVal = pApp;
    v.ppdispVal = &pApp;
    v.vt = VT_DISPATCH;
    return v;

и передает его активному методу x, но он вызывает нарушение прав доступа после вызова. что я делаю не так?

1 Ответ

1 голос
/ 16 марта 2019

Если вы хотите использовать необработанную структуру VARIANT , вы можете кодировать ее следующим образом:

VARIANT v;
VariantInit(&v);
pApp->AddRef();
v.pdispVal = pApp;
v.vt = VT_DISPATCH;
...
// later on, some code (this code or another code) will/should call this
VariantClear(&v); // implicitely calls pdispVal->Release();

Или, если вы используете среду разработки Visual Studio, то выможно просто использовать умные оболочки _variant_t или CComVariant (ATL), которые я рекомендую.В этом случае вы можете просто назвать это так:

IDispatch *pApp = ...

// both wrappers will call appropriate methods
// and will release what must be, when destroyed
CComVariant cv = pApp;

// or

_variant_t vt = pApp;

PS: не используйте оба класса-оболочки, сделайте свой выбор.Если в проекте используется ATL, я использую CComVariant, в противном случае, например, _variant_t.

...