к знатокам Com
Кто может, помогите разбирающемуся в дебрях 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), а потом его преобразовать... Но, как-то грубо...
Вобщем, может кто-нибудь объяснить в чем проблема? Лучше детально =). Или, на крайней случай, кинуть ссылку, где об этом можно прочитать.
Спасибо