Проблема с 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.

В чем тут фишка может быть ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.