Помогите с Invoke!!!
От: D-er2  
Дата: 24.05.06 12:14
Оценка:
Пытаюсь вызвать метод ворда:

Public Overridable Sub Protect(ByVal Type As Word.WdProtectionType, Optional ByRef NoReset As Object = Nothing, Optional ByRef Password As Object = Nothing, Optional ByRef UseIRM As Object = Nothing, Optional ByRef EnforceStyleLock As Object = Nothing)

Вызываю так:

VARIANT_BOOL vb = VARIANT_TRUE;

CComVariant varReturn;
DISPID dispID = 0;
_com_error ev = spDoc->GetIDsOfNames( IID_NULL, &CComBSTR( _T( "Protect" ) ), 1, LOCALE_SYSTEM_DEFAULT, &dispID );
UINT iErr = 0;
DISPPARAMS params = { 0 };

VARIANT* parm = new VARIANT[ 2 ];

parm[ 0 ].vt = VT_I4;
parm[ 0 ].lVal = 2;

parm[ 1 ].vt = VT_BOOL | VT_BYREF;
parm[ 1 ].pboolVal = &vb;

params.cArgs = 2;
params.rgvarg = parm;

EXCEPINFO exInfo = {0};
ev = spDoc->Invoke( dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD , &params, &varReturn, &exInfo, &iErr );

Когда передаю один аргумент, все работает, если два — то нет.
Подскажите что не так.

Спасибо.
Re: Помогите с Invoke!!!
От: Аноним  
Дата: 24.05.06 12:42
Оценка:
Здравствуйте, D-er2, Вы писали:

DE>Пытаюсь вызвать метод ворда:


DE>Public Overridable Sub Protect(ByVal Type As Word.WdProtectionType, Optional ByRef NoReset As Object = Nothing, Optional ByRef Password As Object = Nothing, Optional ByRef UseIRM As Object = Nothing, Optional ByRef EnforceStyleLock As Object = Nothing)


DE>Вызываю так:


DE> VARIANT_BOOL vb = VARIANT_TRUE;


DE> CComVariant varReturn;

DE> DISPID dispID = 0;
DE> _com_error ev = spDoc->GetIDsOfNames( IID_NULL, &CComBSTR( _T( "Protect" ) ), 1, LOCALE_SYSTEM_DEFAULT, &dispID );
DE> UINT iErr = 0;
DE> DISPPARAMS params = { 0 };

DE> VARIANT* parm = new VARIANT[ 2 ];


DE> parm[ 0 ].vt = VT_I4;

DE> parm[ 0 ].lVal = 2;

DE> parm[ 1 ].vt = VT_BOOL | VT_BYREF;

DE> parm[ 1 ].pboolVal = &vb;

DE> params.cArgs = 2;

DE> params.rgvarg = parm;

DE> EXCEPINFO exInfo = {0};

DE> ev = spDoc->Invoke( dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD , &params, &varReturn, &exInfo, &iErr );

DE>Когда передаю один аргумент, все работает, если два — то нет.

С каким одним аргументом работает? Ваш parm[ 1 ] — похоже не в тему — какому параметру функции он должен соответствовать?
Думаю, надо просто передать все параметры, включая опциональные.

Дополнительно (к вопросу не относится):
VARIANT* parm = new VARIANT[ 2 ] лучше заменить на VARIANT parm[2] — зачем лишний раз лезть в кучу?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.