|  | 
 , FreeBASIC , MS SAPI 4. , FreeBASIC, , MS Windows. COM OLE , ( , ). CreateObject() Visual Basic, Visual Basic for Application VBScript. , , FreeBASIC, , , FreeBASIC Visual Basic. OLE (OLE Automation). MS Speech API 4 (MS SAPI 4) OLE , , , , FreeBASIC. , SAPI 4, , , FreeBASIC, "examples\disphelper\" (SAPI 4 SAPI 5). Visual Basic, VBA ., VBScript CreateObject(), , , OLE-. Visual Basic OLE- "". , (methods) / (properties) . OLE- IDispatch, , Visual Basic. (OLE-) OLE "" - , , , , . Visual Basic , . Visual Basic, FreeBASIC , , OLE . , Disphelper, FreeBASIC. C/C++ Disphelper ( ). , FreeBASIC , -, Disphelper, -, SAPI 4 Disphelper. Visual Basic FreeBASIC, . 
' Visual Basic
SET tts = CreateObject("ActiveVoice.ActiveVoice.1")
tts.Speak ("Hello, world!")
' FreeBASIC dhCreateObject ("ActiveVoice.ActiveVoice.1", NULL, @tts) DHCallMethod (tts, ".Speak(%S)", "Hello, world!") , . Disphelper SAPI 4. DisphelperDisphelper IDispatch OLE- . OLE- , printf() C. , printf(), . Disphelper , printf(). , Disphelper ( readme.htm, Disphelper): 
 Disphelper, . 
 , . DHCallMethod, DHPutValue DHGetValue. disphelper.bi, FreeBASIC "inc\disphelper\".. DHCallMethod , , . D IDispatch PTR (, Visual Basic, ), , . , . , Method1 Object1, : DHCallMethod (Object1, ".Method1(%d)", 100) DHPutValue? . , Property1 : DHPutValue (Object1, ".Property1=%d", 100) DHGetValue. , , , , : 
Dim Value As Integer
DHGetValue ("%d", @Value, Object1, ".Property1")
Disphelper HRESULT, OLE-. . , . (, ), . Direct Speech SynthesisSAPI 4Direct Speech Synthesis - , MS SAPI 4. , . MS Windows 2000, SAPI 4 , , . MS Windows 9x XP SAPI MS SAPI 4 SDK4. SAPI 4 , . : Member: ActiveVoice.ActiveVoice.1 Function: CreateObject Error In: CreateObjectEx Error: Code: 800401f3 Source: Application , , ProgId ( "ActiveVoice.ActiveVoice.1") CLSID, . . Windows XP "activevoice.reg" : 
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\ActiveVoice.ActiveVoice.1]
@="Direct Speech Synthesis"
[HKEY_CLASSES_ROOT\ActiveVoice.ActiveVoice.1\Clsid]
@="{EEE78591-FE22-11D0-8BEF-0060081841DE}"
Windows ( Enter) . SAPI 4 . Win32 API, , , , . Direct Speech Synthesis, . , MS SAPI 4 SDK. , Disphelper. : 
 , : 
 FreeBASICDisphelper FreeBASIC. -, Disphelper Unicode. : #define UNICODE -, "disphelper.bi", FreeBASIC. : #include "disphelper/disphelper.bi" -, Direct Speech Synthesis . . Windows, . , , . : 
 sapi4.bas. Disphelper . sapi4.bas. "", "" Disphelper. -, ( ) speech.bas. , MS SAPI 5 FreeBASIC, , sapi4.bas , sapi5.bas. , sapi4.bas , "" . , DISPATCH_OBJ(), ( IDispatch OLE-) , FreeBASIC . : dim SHARED as IDispatch ptr tts = NULL speech.bas
'  speech.bas
'   SAPI 4    
'    FreeBASIC
'' : fbc -s gui speech.rc speech.bas sapi4.bas 
'' 
'' 
option explicit 
#define UNICODE
#include once "windows.bi" 
#include "disphelper/disphelper.bi"
'       SAPI 4
#include "sapi4.bi"
'    
#include "resource.bi"
'   
DECLARE FUNCTION DlgProc (byval hwnd as HWND, byval umsg as UINT, byval wparam as WPARAM, byval lparam as LPARAM) as BOOL
             
'  
dim SHARED 	  as IDispatch ptr tts = NULL
'  Disphelper
	dhInitialize( TRUE )
'       
	dhToggleExceptions( TRUE )
'   
  DialogBoxParam( GetModuleHandle( NULL ), cptr( LPCSTR, IDD_DLG1 ), NULL, @DlgProc, NULL ) 
'  ,  
	SAFE_RELEASE( tts)
'    Disphelper
	dhUninitialize( TRUE )
  end 
'    
                 '   
Function DlgProc (byval hwnd as HWND, byval umsg as UINT, byval wparam as WPARAM, byval lparam as LPARAM) as BOOL
  dim as long id, event
  
  select case uMsg
  case WM_INITDIALOG
'   Direct Speech Synthesis 
If TRUE <> SAPI4_Initialize(tts) Then
  	EndDialog( hwnd, 0 ) 
Return TRUE
End If
'     
SAPI4_GetVoices(tts, GetDlgItem(hWnd, IDC_VOICES_LIST))
'    
SAPI4_SelectVoice (tts, 1)
'   
SAPI4_SetSpeed (tts, 80)
  case WM_CLOSE
  	EndDialog( hwnd, 0 ) 
  case WM_COMMAND
		id  = loword( wParam )
		event = hiword( wParam )
    select case id
    case IDOK 
'  
scope
DIM szBuf AS WSTRING * 1024
GetDlgItemText(hWnd, IDC_TEXT_TO_SPEAK, szBuf, 1024)
SAPI4_Speak (tts, @szBuf)
End Scope
case IDCANCEL
    	EndDialog( hwnd, 0 )
case IDC_VOICES_LIST:
'    
If (event = CBN_SELCHANGE) Then
SAPI4_SelectVoice (tts, SendDlgItemMessage (hWnd, Id, CB_GETCURSEL, 0, 0)+1)
End If
  	end select
    
  case else
  	return FALSE
  
  end select
  
  return TRUE
end function 
sapi4.bas
'  sapi4.bas
'       Direct Speech 
'    Disphelper
option explicit 
#define UNICODE
#include once "windows.bi" 
#include "disphelper/disphelper.bi"
' SAPI4_Initialize    ActiveVoice.ActiveVoice.1   .
' : TRUE,    ; FALSE -   .
FUNCTION SAPI4_Initialize (byRef Object As IDispatch PTR) As BOOL
Dim As String ProgId = "ActiveVoice.ActiveVoice.1"
IF FAILED(dhCreateObject (ProgId, NULL, @Object) THEN
RETURN FALSE
END IF
dhPutValue(Object, ".Initialized = %u", 1)
RETURN TRUE
END FUNCTION
'  SAPI4_GetVoices    , 
'       ,   .
SUB SAPI4_GetVoices (byRef object As IDispatch PTR,byval hCtrl as HWND)
Dim MaxVoice AS INTEGER
Dim szBuf AS WSTRING * 1024
Dim szSpeaker AS WSTRING PTR
Dim szProduct AS WSTRING PTR
Dim i AS INTEGER
SendMessage (hCtrl, CB_RESETCONTENT, 0, 0)
DHGetValue("%d", @MaxVoice, Object, ".CountEngines")
FOR i = 1 TO MaxVoice
DHGetValue("%S", @szSpeaker, Object, ".Speaker(%d)", i)
DHGetValue("%S", @szProduct, Object, ".ProductName (%d)", i)
szBuf = *szSpeaker + ": " +*szProduct
SendMessage (hCtrl, CB_ADDSTRING, 0, @szBuf)
NEXT
SendMessage (hCtrl, CB_SETCURSEL, 0, 0)
			dhFreeString(szSpeaker)
			dhFreeString(szProduct)
END SUB
'  SAPI4_SelectVoice      
'    .
SUB SAPI4_SelectVoice (byRef Object As IDispatch PTR, byVal Index As INTEGER)
Dim MaxVoice AS INTEGER
DHGetValue("%d", @MaxVoice, Object, ".CountEngines")
IF Index > 0 AND Index <= MaxVoice THEN 
dhCallMethod(Object, ".Select(%u)", Index)
END IF
END SUB
'  SAPI4_SetSpeed    .
'        .
SUB SAPI4_SetSpeed (byRef Object As IDispatch PTR, byVal Speed As INTEGER)
dhPutValue(Object, ".Speed=%u", Speed) 
END SUB
'  SAPI4_Speak   ,  .
SUB SAPI4_Speak (byRef Object As IDispatch PTR, byVal Phrase As WString PTR)
dhCallMethod(Object, ".Speak(%S)", Phrase)
END SUB
sapi4.bi' sapi4.bi ' sapi4.bas #ifndef __SAPI4_BI__ #define __SAPI4_BI__ DECLARE FUNCTION SAPI4_Initialize (byRef Object As IDispatch PTR) As BOOL DECLARE SUB SAPI4_GetVoices (byRef Object As IDispatch PTR, byval hCtrl as HWND) DECLARE SUB SAPI4_SelectVoice (byRef Object As IDispatch PTR, byVal Index As Integer) DECLARE SUB SAPI4_SetSpeed (byRef Object As IDispatch PTR, byVal Speed As Integer) DECLARE SUB SAPI4_Speak (byRef Object As IDispatch PTR, byVal Phrase As WString PTR) #endif resource.bi#ifndef IDC_STATIC #define IDC_STATIC -1 #endif #define IDD_DLG1 1000 #define IDC_VOICES_LIST 1001 #define IDC_TEXT_TO_SPEAK 1002 speech.rc#include "resource.bi" IDD_DLG1 DIALOGEX 0,0,200,100 CAPTION "Text-to-speech" FONT 8,"MS Sans Serif" STYLE 0x10CC0000 EXSTYLE 0x00000080 BEGIN LTEXT "Voice:", IDC_STATIC, 5, 5, 40, 9 COMBOBOX IDC_VOICES_LIST, 50, 5, 145, 10, WS_TABSTOP| CBS_DROPDOWNLIST | WS_VSCROLL LTEXT "Text to speak:", IDC_STATIC, 5, 5+11, 100, 10 EDITTEXT IDC_TEXT_TO_SPEAK, 5, 5+22, 190, 10 DEFPUSHBUTTON "Speak", IDOK, 120, 5+44, 35, 10 PUSHBUTTON "", IDCANCEL, 120+37, 5+44, 35, 10 END 
 | ||
|  | |||