Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

к знатокам Com

12K
16 августа 2005 года
Романтик
4 / / 13.08.2005
Здрасти.

Кто может, помогите разбирающемуся в дебрях COM.
Проблема такая. С помощью ATL-wizard создал заготовку. Добавил новый объект.
По условию задачи, компонент должен реализовывать интерфейс, содержащий такие функции:

[FONT=courier new]
HRESULT func1([in] SAFEARRAY Data)
HRESULT func2([out, retval] SAFEARRAY *pData)[/FONT]

и быть таким, чтоб его можно было использовать в VB, и... ну где угодно. В IDL-файле мастер создал такую заготовку интерфейса:

[FONT=courier new]
[
object, uuid(...), dual, nonextensible,
helpstring("IBackProv Interface"),
pointer_default(unique),
]
interface IInter : IDispatch{
[id(1), helpstring("method func1")] HRESULT func1([in] SAFEARRAY saData);
[id(2), helpstring("method Restore")] HRESULT func2([out,retval] SAFEARRAY* psaData);
};
[/FONT]

И при компиляции, VS (кстати, VS .NET 7.1) выдает такие ошибки:

[FONT=courier new]
1)c:\...\Component.idl(20): error MIDL2105 : pointee / array does not derive any size : [ Field 'rgsabound' of Struct 'tagSAFEARRAY' ( Parameter 'saData' ) ]

2)c:\...\Component.idl(20): error MIDL2139 : type of the parameter cannot derive from void or void * : [ Type 'PVOID' ( Parameter 'saData' ) ]

3)c:\...\Component.idl(20): error MIDL2465 : Structures containing conformant arrays must be passed by reference. See MSDN for more details : [ Struct 'tagSAFEARRAY' ( Parameter 'saData' ) ]
[/FONT]

для первой функции, а для второй

[FONT=courier new]
1)c:\...\Component.idl(21): error MIDL2040 : [out] only parameter cannot be a pointer to an open structure : [ Parameter 'psaData' of Procedure 'Restore' ( Interface 'IBackProv' ) ]

2)c:\...\Component.idl(21): error MIDL2105 : pointee / array does not derive any size : [ Field 'rgsabound' of Struct 'tagSAFEARRAY' ( Parameter 'psaData' ) ]

3)c:\...\Component.idl(21): error MIDL2139 : type of the parameter cannot derive from void or void * : [ Type 'PVOID' ( Parameter 'psaData' ) ]
[/FONT]

Не понимаю суть проблемы. Вроде, компилятор не может определить размеры аргументов, но size_is не помагает. Использовать VARIANT... Но, по условию должен быть SAFEARRAY. Ну, не знаю, можно принимать массивчик BYTE*, размер которого sizeof(SAFEARRAY), а потом его преобразовать... Но, как-то грубо...

Вобщем, может кто-нибудь объяснить в чем проблема? Лучше детально =). Или, на крайней случай, кинуть ссылку, где об этом можно прочитать.

Спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог