com_event_sink()
(PHP 4 >= 4.2.0, PHP 5, PHP 7)
Connect events from a COM object to a PHP object
说明
com_event_sink(variant$comobject,object $sinkobject[,mixed $sinkinterface]): bool
Instructs COM to sink events generated by$comobjectinto the PHP object$sinkobject.
Be careful how you use this feature; if you are doing something similar to the example below, then it doesn't really make sense to run it in a web server context.
参数
- $comobject
- $sinkobject
$sinkobjectshould be an instance of a class with methods named after those of the desired dispinterface; you may use com_print_typeinfo() to help generate a template class for this purpose.
- $sinkinterface
PHP will attempt to use the default dispinterface type specified by the typelibrary associated with$comobject, but you may override this choice by setting$sinkinterfaceto the name of the dispinterface that you want to use.
返回值
成功时返回TRUE
,或者在失败时返回FALSE
。
范例
COM event sink example
<?php class IEEventSinker { var $terminated = false; function ProgressChange($progress, $progressmax) { echo "Download progress: $progress / $progressmax\n"; } function DocumentComplete(&$dom, $url) { echo "Document $url complete\n"; } function OnQuit() { echo "Quit!\n"; $this->terminated = true; } } $ie = new COM("InternetExplorer.Application"); // note that you don't need the & for PHP 5! $sink = new IEEventSinker(); com_event_sink($ie, $sink, "DWebBrowserEvents2"); $ie->Visible = true; $ie->Navigate("http://www.example.org"); while(!$sink->terminated) { com_message_pump(4000); } $ie = null; ?>
参见
com_print_typeinfo()
Print out a PHP class definition for a dispatchable interfacecom_message_pump()
Process COM messages, sleeping for up to timeoutms milliseconds
I got voice recognition working. I'm not sure why the way I called the sink function made it work but I'm more about results right now. This small example had me rolling on the floor laughing. <?php /* * Search this for more info on the voice stuff: * Automation Interfaces and Objects (SAPI 5.4) */ //directions: //php friend.php //then fire up windows voice recognition and turn it on and say stuff $voice = new COM("SAPI.SpVoice"); print "Hit control+c to end.\n"; print "Friend: Hello friend!\n"; $voice->Speak("Hello friend!"); class listen { function Recognition($StreamNumber, $StreamPosition, $RecognitionType, $ISpeechRecoResult) { $phrase = $ISpeechRecoResult->PhraseInfo; $text = $phrase->GetText(); print "\nYou:$text\n"; global $voice; $say = array('oh', 'nice', 'humm', 'interesting', 'you dont say', 'uh huh', 'right', 'what', 'ha ha', 'you have got to be joking', 'right back at you buddy'); $idx = rand(0, count($say)-1); print "Friend: " . $say[$idx] . "\n"; $voice->Speak($say[$idx]); } } $recog = new COM("SAPI.SpSharedRecognizer"); $context = $recog->CreateRecoContext(); //SRERecognition = 16 (default) //SREAllEvents = 393215 //$context->EventInterests = 393215; //try to listen to events on context $listen = new listen(); //event handler if (!com_event_sink($context, $listen, "RecognizerStateChange")) { print "Unable to sink events\n"; exit; } $grammar = $context->CreateGrammar(); $i = $grammar->DictationLoad(); $s = $grammar->DictationSetState(1); //1=on, 0=off while(true) { if(!com_message_pump(1000)) { print "."; } } ?>
In case someone needs a skeleton sink for ADODB.Connection events: class ADOConnectionEventSink { function BeginTransComplete( $translevel, $objerror, $status, $objconn ) { return 0; } function CommitTransComplete( $objerror, $status, $objconn ) { return 0; } function RolbackTransComplete( $objerror, $status, $objconn ) { return 0; } function WillConnect ( $ConnectionString, $userid, $psword, $options, $status, $objconn ) { return 0; } function ConnectComplete ( $objerror, $status, $objconn) { return 0; } function Disconnect( $status, $objConn ) { return 0; } function WillExecute ( $src, $cursortyp, $locktyp, $options, $status, $objcomm, $objrs, $objconn ) { return 0; } function ExecuteComplete ( $recaffected, $objerror, $status, $objcomm, $objrs, $objconn ) { return 0; } function InfoMessage ( $objerror, $status, $objconn) { return 0; } } // later on... $db = new COM("ADODB.Connection", NULL, $charPage); $sink = new ADOConnectionEventSink(); com_event_sink($db, $sink, "ConnectionEvents"); //...