Имеется приблизительно такой код:
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.
В чем тут фишка может быть ?