Проблема с VARIANT_BOOL
От: toperrus  
Дата: 24.10.03 06:14
Оценка:
Имеется приблизительно такой код:
Func()
{...
  VARIANT_BOOL vb;
  pObject->Fire_RestoreConnection(bstrLib, & vb);
  if(vb == VARIANT_TRUE) ::MessageBox(...,"True",...);
  else ::MessageBox(...,"False",...);
...
}

в idl в _ILibraryEvents:
  [id(2), helpstring("method RestoreConnection")] HRESULT RestoreConnection([in] BSTR lib, [in, out] VARIANT_BOOL* restore);

и соответственно в ILibraryEvents_CP.h в Fire_RestoreConnection(BSTR lib, VARIANT_BOOL *restore):
CComVariant avarParams[2];
avarParams[1] = lib;
avarParams[0].vt = VT_BYREF|VT_BOOL;
avarParams[0] = restore;
CComVariant varResult;
DISPPARAMS params = { avarParams, NULL, 2, 0 };


Тестирую на VB, там соответственно так:
Sub MyLib_RestoreConnection(ByVal Lib As String, ByRef restore As Boolean)
  MsgBox Lib
  restore = True
End Sub


Проблемы:
1. Обработчик на VB не вызывается (MsgBox Lib не выскакивает), MessageBox в Func() всегда выдает false.
2. После выполнения Func(), при повторном запуске приложения в VB выдается AutomationError на строчке
Set MyLib = New LibraryLib.Library

Если VARIANT_BOOL* заменить на INT*, соответственно idl подправить, в ILibraryEvents_CP.h:
avarParams[0].vt = VT_BYREF|VT_INT;
В обработчике изменить на ByRef restore as Long и restore = 1, то все работает,
обработчик вызывается, restore изменяется, никаких AutomationError.

В чем тут фишка может быть ?
Re: pboolVal
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.10.03 08:58
Оценка:
Здравствуйте, toperrus, Вы писали:

T>CComVariant avarParams[2];
T>avarParams[1] = lib;
T>avarParams[0].vt = VT_BYREF|VT_BOOL;
T>avarParams[0] = restore;

T>В чем тут фишка может быть ?

А отладчик на что?
avarParams[0].vt = VT_BYREF|VT_BOOL;
avarParams[0].pboolVal = restore;
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.