Проблемы при работе с QueryInterface

Автор The_Prophet, 11.12.19, 21:49:15

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

The_Prophet

Здравствуйте, уважаемые форумчане. Возникла следующая проблема: при получении интерфейса IDrawingContainer через QueryInterface от IView, вместо
 IDrawingContainer возвращается интерфейс IView. Среда разработки Microsoft Visual Studio 2017. КОМПАС V18.

#include <objbase.h>

#include <iostream>

VARIANT getProperty(IDispatch *pDispatch, const wchar_t *szProperty)
{
DISPID dispid;
OLECHAR *szMember = const_cast<wchar_t *>(szProperty);

HRESULT hresult = pDispatch->GetIDsOfNames(IID_NULL, &szMember, 1, GetUserDefaultLCID(), &dispid);

/*VARIANTARG args;
VariantInit(&args);*/

DISPPARAMS dispparams;
dispparams.cArgs = 0;
dispparams.cNamedArgs = 0;
dispparams.rgdispidNamedArgs = NULL;
dispparams.rgvarg = NULL;

VARIANT result;

hresult = pDispatch->Invoke(dispid, IID_NULL, GetUserDefaultLCID(),
DISPATCH_PROPERTYGET, &dispparams, &result, NULL, NULL);

return result;
}

int main()
{
CoInitialize(NULL);

CLSID clsid;
HRESULT result = CLSIDFromProgID(OLESTR("KOMPAS.Application.7"), &clsid);

IID IID_Application;
result = IIDFromString(OLESTR("{6a2efaf7-8254-45a5-9dc8-2213f16af5d7}"), &IID_Application);

IDispatch *pIApplication = (IDispatch *)NULL;
result = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_Application, (void **)&pIApplication);

IDispatch *pIDocuments = (IDispatch *)NULL;

pIDocuments = getProperty(pIApplication, L"Documents").pdispVal;

DISPID dispid;
OLECHAR *szMember = const_cast<wchar_t *>(L"Add");

result = pIDocuments->GetIDsOfNames(IID_NULL, &szMember, 1, GetUserDefaultLCID(), &dispid);

VARIANTARG args[2];
VariantInit(args);
args[0].vt = VT_INT;
args[0].intVal = 1;
args[1].vt = VT_BOOL;
args[1].boolVal = TRUE;

DISPPARAMS dispparams;
dispparams.cArgs = 2;
dispparams.cNamedArgs = 0;
dispparams.rgdispidNamedArgs = NULL;
dispparams.rgvarg = args;

VARIANT varResult;
EXCEPINFO excepInfo;
UINT argError;

result = pIDocuments->Invoke(dispid, IID_NULL, GetUserDefaultLCID(),
DISPATCH_METHOD, &dispparams, &varResult, &excepInfo, &argError);

IDispatch *pIKompasDocument = varResult.pdispVal;

IDispatch *pIKompasDocument2D = (IDispatch *)NULL;
IID IID_KompasDocument2D;

result = IIDFromString(OLESTR("{096e62b3-7184-4998-9925-74bb710d8d8e}"), &IID_KompasDocument2D);

result = pIKompasDocument->QueryInterface(IID_KompasDocument2D, (void **)&pIKompasDocument2D);

IDispatch *pIViewsAndLayersManager = (IDispatch *)NULL;
pIViewsAndLayersManager = getProperty(pIKompasDocument2D, L"ViewsAndLayersManager").pdispVal;

IDispatch *pIViews = (IDispatch *)NULL;
pIViews = getProperty(pIViewsAndLayersManager, L"Views").pdispVal;

IDispatch *pIView = (IDispatch *)NULL;
pIView = getProperty(pIViews, L"ActiveView").pdispVal;

IDispatch *pIDrawingContainer = (IDispatch *)NULL;
IID IID_DrawingContainer;

IIDFromString(OLESTR("{d603fec9-75b7-4fa5-918f-47074c45b848}"), &IID_DrawingContainer);

result = pIView->QueryInterface(IID_DrawingContainer, (void **)&pIDrawingContainer);


return 0;
}

При попытке получить от pIDrawingContainer какие либо свойства ничего не возвращается. В чем может быть проблема?

Slaviation

Да, действительно, интерфейс контейнера объектов от интерфейса вида не определяется. Если требование к коду на предмет позднего связывания не является обязательным, то может лучше импортировать библиотеку типов в проект и использовать интерфейсы "по обычному"?

The_Prophet

13.12.19, 18:40:16 #2 Последнее редактирование: 13.12.19, 21:53:52 от The_Prophet
Импорт хорошо работает, если мы пишем в среде VS, но импорт в QtCreator не получается успешно провести. Поэтому и приходится использовать данный способ. Не понятно только почему не возвращается интерфейс. Тоже самое происходит и при получении ISymbols2DContainer.