IDispatch->Invoke( как передать структуру ??? )

xz_post

Необходимо вызвать метод COM объекта через IDispatch.Invoke. У метода всего 1 параметр - структура, для простоты скажем это struct Point (int x, int y). Вопрос - как правильно проинициализировать DISPPARAMS (это 5-ый параметр в Invoke-e).
VARIANTARG FAR rgvarg[1]; - это массив переменных
Что надо написать вместо знаков ?
rgvarg[0]. ? = ? ;//Передать саму структуру
rgvarg[0].vt = ? ; //Какой тип указать ?
Пробовал передавать указатель на структуру, но получаю ошибку
HRESULT hr = E_INVALIDARG
Помогите плис !
//или дайте ссылку где это прочитать (без инета)

kokoc88

Из структуры придётся делать интерфейс.

freezer

см IRecordInfo Interface

psm-home

Может, не совсем в тему, но... Вот , там есть раздел "Структуры в Automation", возможно это то, что нужно.

xz_post

Спасибо ! Статья как раз в тему !
Для работы с automation-структурами необходимо иметь указатель на интерфейс IRecordInfo, описывающий структуру. Если имеется ссылка на SAFEARRAY, этот интерфейс можно получить с помощью метода SafeArrayGetRecordInfo. IRecordInfo можно так же позаимствовать из VARIANT, если в нем находится структура требуемого типа. Если же получить IRecordInfo вышеперечисленными способами невозможно, придется получать его с помощью функции GetRecordInfoFromGuids или GetRecordInfoFromTypeInfo. Это значительно сложнее, но все же доступно большинству смертных. Чуть позже вы увидите, как они работают.

На самом деле я работаю не с COM, а c .net - классом из неуправляемого c++. Пока удалось вытащить IRecordInfo из готового VARIANT - для этого на C# написал дополнительный метод
GetStructInfo, а полученный в результате вызова VARIANT out_value подставлял при вызове TestStruct - это работает... сейчас попробую заставить работать GetRecordInfoFromGuids


//C#
public void TestStruct(MyPoint p)
{
Console.WriteLine("x={0}, y={1}",p.x, p.y);
}
public MyPoint GetStructInfo
{
MyPoint p;
p.x = 15;
p.y = 23;
return p;
}

public struct MyPoint
{
public int x;
public int y;
}


Еще раз спасибо
Оставить комментарий
Имя или ник:
Комментарий: