Перейти к публикации

Конкретный вопрос по Sw Api


OriginalZealot

Рекомендованные сообщения

Из хелпа:

Syntax (COM)

status = Component2->IGetChildren ( &retval )

Output:

(LPCOMPONENT2*) retval

Pointer to an array of Component2 objects

Return:

(HRESULT) status

S_OK if successful

COM applications should use to Component2::IGetChildrenCount to determine the number of component children, which is the size of the array required to Component2::IGetChildren.

Определяю размер массива, выделяю память - первый компонент находится, а остальных нет.

Мысль N1: зачем передавать параметр по ссылке(а там именно указатель на указатель требуется), если расположение массива всё равно определяю я(т.к. я память под него должен выделять).

Мысль N2: пытался интерпретировать данную конструкцию как массив указателей на компоненты - результат, как ни странно, тот же.

Ссылка на сообщение
Поделиться на других сайтах


Определяю размер массива, выделяю память - первый компонент находится, а остальных нет.

<{POST_SNAPBACK}>

Может их и правда нет, в чем вопрос собственно. Есть status = Component2->IGetChildrenCount ( &retval ) которая выдает количество компонентов. Если вы посмотрите по хелпу то везде идут ссылки, полагаю для экономии ресурсов.
Ссылка на сообщение
Поделиться на других сайтах

В том то и дело, что они есть. Кроме того, IComponent2::IGetChildrenCount() возвращает правильное количество компонентов.

Ссылка на сообщение
Поделиться на других сайтах

To OriginalZealot

А если так, правда сделана в VS2003.

//........................................



	HRESULT hres;

	CComPtr<IModelDoc2> swModel;

	hres = iSwApp->get_IActiveDoc2(&swModel);



	CComPtr<IConfiguration> swConfig;

	hres = swModel->IGetActiveConfiguration(&swConfig);



	CComPtr<IComponent> swRootComponent;

	hres = swConfig->IGetRootComponent(&swRootComponent);



	VARIANT vChild;

	hres = swRootComponent->GetChildren(&vChild);



	SAFEARRAY* arrComp = V_ARRAY(&vChild);

	LPDISPATCH* pDispComp;

	long lHightIndex;

	long lCountComp;

	hres = SafeArrayAccessData(arrComp, (void**)&pDispComp);



	hres = SafeArrayGetUBound(arrComp, 1, &lHightIndex);

	lCountComp = lHightIndex +1;

	int iCount = static_cast<int>(lCountComp);

	for ( int i = 0; i < lCount; i++)

	{

		CComQIPtr<IComponent2>  swComponent;

		swComponent = pDispComp[i];

		VARIANT_BOOL bSupp;

		swComponent->IsSuppressed(&bSupp);

//.................................

	}
Ссылка на сообщение
Поделиться на других сайтах

На данный момент я сделал именно так, но это небезопасно с точки зрения типов com-интерфейсов.

Остается надеятся, что GetChildren вернет именно массив IComponent2.

Да собственно GetChildren это форма предназначеная для использования там, где работа с COM обрабатывается на уровне языка.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...