Error: Unresolved external '_hb_iswinsp' referenced from C:\HARBOUR\LIB\WIN\BCC\HBWIN.LIB|win_osc
Error: Unresolved external '_HB_FUN_HB_OSISWIN7' referenced from C:\HARBOUR\LIB\WIN\BCC\HBWIN.LIB|win_os
lOleError = HB_VTBL( pDisp )->Invoke( HB_THIS_(pDisp) dispid, HB_ID_REF(IID_NULL),
LOCALE_USER_DEFAULT,
( V_VT( dispparam.rgvarg ) == VT_DISPATCH ) ? DISPATCH_PROPERTYPUTREF : DISPATCH_PROPERTYPUT,
&dispparam, NULL, &excep, &uiArgErr );
function main()
local oVoice := CreateObject( "Sapi.SPVoice", "WithEvents" )
// oVoice:WithEvents = .T.
oVoice:EventInterests = 327679
oVoice:__hSink := __axRegisterHandler( oVoice:__hObj, { | ... | QOut( ... ) } )
// oVoice:voice = oVoice:GetVoices():Item( 0 )
oVoice:Speak( "harbour and xharbour" )
oVoice:Speak( "another" )
return nil
Antonio Linares wrote:Dear Jimmy,
I have reviewed the topic at https://hmgforum.com/viewtopic.php?t=7505 I have requested to join the forums so maybe we can solve it together.
I have been trying to use the events and it seems as something is missing:
- Code: Select all Expand view RUN
function main()
local oVoice := CreateObject( "Sapi.SPVoice", "WithEvents" )
// oVoice:WithEvents = .T.
oVoice:EventInterests = 327679
oVoice:__hSink := __axRegisterHandler( oVoice:__hObj, { | ... | QOut( ... ) } )
// oVoice:voice = oVoice:GetVoices():Item( 0 )
oVoice:Speak( "harbour and xharbour" )
oVoice:Speak( "another" )
return nil
HB_FUNC( WIN_OLEAUTO___ONERROR )
{
IDispatch * pDisp;
const char * szMethod;
wchar_t szMethodWide[ HB_SYMBOL_NAME_LEN + 1 ];
OLECHAR * pMemberArray;
DISPID dispid;
DISPPARAMS dispparam;
VARIANTARG variant;
EXCEPINFO excep;
UINT uiArgErr;
HRESULT lOleError;
HB_USHORT uiClass;
int iPCount;
hb_oleInit();
uiClass = hb_objGetClass( hb_stackSelfItem() );
if( uiClass == 0 )
return;
/* Get object handle */
hb_vmPushDynSym( s_pDyns_hObjAccess );
hb_vmPush( hb_stackSelfItem() );
hb_vmSend( 0 );
pDisp = hb_oleParam( -1 );
if( ! pDisp )
return;
iPCount = hb_pcount();
szMethod = hb_itemGetSymbol( hb_stackBaseItem() )->szName;
AnsiToWideBuffer( szMethod, szMethodWide, ( int ) HB_SIZEOFARRAY( szMethodWide ) );
/* Try property put */
if( szMethod[ 0 ] == '_' && iPCount >= 1 )
{
pMemberArray = &szMethodWide[ 1 ];
lOleError = HB_VTBL( pDisp )->GetIDsOfNames( HB_THIS_( pDisp ) HB_ID_REF( IID_NULL ), &pMemberArray,
1, LOCALE_USER_DEFAULT, &dispid );
if( lOleError == S_OK )
{
DISPID lPropPut = DISPID_PROPERTYPUT;
memset( &excep, 0, sizeof( excep ) );
GetParams( &dispparam, 0, HB_FALSE, 0, NULL, NULL );
dispparam.rgdispidNamedArgs = &lPropPut;
dispparam.cNamedArgs = 1;
lOleError = HB_VTBL(pDisp)->Invoke(HB_THIS_(pDisp) dispid, HB_ID_REF(IID_NULL),
LOCALE_USER_DEFAULT,
(V_VT(dispparam.rgvarg) == VT_DISPATCH) ? DISPATCH_PROPERTYPUTREF : DISPATCH_PROPERTYPUT,
&dispparam, NULL, &excep, &uiArgErr);
FreeParams( &dispparam );
lOleError = HB_VTBL(pDisp)->Invoke(HB_THIS_(pDisp) dispid, HB_ID_REF(IID_NULL),
LOCALE_USER_DEFAULT,
(V_VT(dispparam.rgvarg) == VT_DISPATCH) ? DISPATCH_PROPERTYPUTREF : DISPATCH_PROPERTYPUT,
&dispparam, NULL, &excep, &uiArgErr);
function main()
local oVoice := CreateObject( "Sapi.SPVoice", "WithEvents" )
// oVoice:WithEvents = .T.
oVoice:EventInterests = 327679
oVoice:__hSink := __axRegisterHandler( oVoice:__hObj, { | ... | QOut( ... ) } )
// oVoice:voice = oVoice:GetVoices():Item( 0 )
oVoice:Speak( "harbour and xharbour" )
oVoice:Speak( "another" )
return nil
Antonio Linares wrote:Estimado Daniel,
Lo que no hemos conseguido que funcione son los eventos.
A ver si entre todos descubrimos como hacerlo funcionar:
- Code: Select all Expand view RUN
function main()
local oVoice := CreateObject( "Sapi.SPVoice", "WithEvents" )
Eventos de voz
A medida que una voz habla texto, puede generar eventos cuando detecta ciertas condiciones en el flujo de entrada. Estos eventos están contenidos en la enumeración SpeechVoiceEvents. Ejemplos de estos eventos son la finalización de fonemas, palabras u oraciones, así como cambios de voz o la presencia de marcadores. La gama de condiciones que SpeechVoiceEvents puede informar es lo suficientemente amplia como para que la mayoría de las aplicaciones utilicen sólo algunas de ellas. Para evitar que el motor TTS genere eventos que la aplicación ignorará, utilice la propiedad EventInterests para especificar los eventos de interés. Sólo se plantearán estos eventos.
El punto en el flujo de texto de entrada en el que se ha completado un evento potencial se denomina límite de evento. En cada límite de evento, el tipo de evento se compara con los EventInterests actuales. Si el tipo de evento es de interés, se genera un evento de ese tipo. Los eventos de voz devuelven el número de flujo de entrada para asociarlos con el flujo apropiado.
function main()
local oVoice := TOleAuto():New( "Sapi.SPVoice" )
// oVoice:WithEvents = .T.
oVoice:EventInterests = 327679
oVoice:__hSink := __axRegisterHandler( oVoice:__hObj, { | ... | QOut( ... ) } )
oVoice:Speak( "harbour and xharbour" )
oVoice:Speak( "another" )
return nil
test.prg(7) Error E0030 Syntax error "syntax error at '...'"
Return to FiveWin for Harbour/xHarbour
Users browsing this forum: No registered users and 31 guests