• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Проблемы при работе с 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.

JohnSmith

Добрый день, можно мне пояснительную бригаду
Столкнулся с этой проблемой, так и не могу понять как добраться до IDrawingContainer.
На счет
Цитата: Slaviation от 13.12.19, 07:33:02импортировать библиотеку типов в проект и использовать интерфейсы "по обычному"
тоже не понял(( Подскажите пжлст, где а могу найти эту библиотеку?

JohnSmith

Вот так получилось
drawing_container = kompas_api7_module.IDrawingContainer(view)

Slaviation

Добрый день.
Цитироватьтоже не понял(( Подскажите пжлст, где а могу найти эту библиотеку?
#import "Bin\\kAPI7.tlb" no_namespace named_guids
Bin - каталог КОМПАС-3D, там она должна быть.