Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : COM and .Net (Windows) : COM

COM

COM class ()
com COM::COM ( string module_name [, mixed server_name [, int codepage [, string typelib]]] )
void COM::AddRef ( )
void COM::Release ( )
variant COM::All ( )
variant COM::Next ( )
variant COM::Prev ( )
void COM::Reset ( )

Example 405. COM example (1)

<?php
// starting word
$word = new COM("word.application") or die("Unable to instantiate Word");
echo
"Loaded Word, version {$word->Version}\n";

//bring it to front
$word->Visible = 1;

//open an empty document
$word->Documents->Add();

//do some weird stuff
$word->Selection->TypeText("This is a test...");
$word->Documents[1]->SaveAs("Useless test.doc");

//closing word
$word->Quit();

//free the object
$word = null;
?>

Example 406. COM example (2)

<?php

$conn
= new COM("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=SQLOLEDB; Data Source=localhost;
Initial Catalog=database; User ID=user; Password=password"
);

$rs = $conn->Execute("SELECT * FROM sometable");    // Recordset

$num_columns = $rs->Fields->Count();
echo
$num_columns . "\n";

for (
$i=0; $i < $num_columns; $i++) {
   
$fld[$i] = $rs->Fields($i);
}

$rowcount = 0;
while (!
$rs->EOF) {
   for (
$i=0; $i < $num_columns; $i++) {
       echo
$fld[$i]->value . "\t";
   }
   echo
"\n";
   
$rowcount++;            // increments rowcount
   
$rs->MoveNext();
}

$rs->Close();
$conn->Close();

$rs = null;
$conn = null;

?>

Related Examples ( Source code ) » class.com
















Code Examples / Notes » class.com

volker

To use the windows speech system install the "Speech SDK 5.1 for Windows® applications" from the Microsoft homepage (free download).
Then you can do Text2Speech like this:
$voice = new COM("SAPI.SpVoice");
$voice->Speak("Hello, lets have a conversation");


euresman

To mstaiger
I have encountered the same problem you report.
I tried to use the above code for a word document but it doesn't works, although the same code was good if i use it on a excel sheet.
The solution is explained at the following link :
http://www.phpbuilder.net/columns/venkatesan20030501.php3


mstaiger

The example above (MS Word) is quiet unsatisfying, as I find. Especially since I couldn't find anybody who actually got it running, including myself.
You might therefore give this Powerpoint-example a chance:
----------------------------------
#Instantiate a PowerPoint object.
$ppoint = new COM("PowerPoint.application") or die("Unable to instantiate PowerPoint");
<?php
#Create a new presentation
$ppoint->Presentations->Add() or die ("Could not create presentation");
//Add a slide
$slide=$ppoint->Presentations[1]->Slides->Add(1,1);
//Get the name of this slide
$slidename = $slide->Name();
echo"
slidename : $slidename";
//Change the name of this new slide
$slide->Name = "New Slidename";
$slidename = $slide->Name();
echo"
NEW slidename : $slidename";
//Save the presentation
$ppoint->Presentations[1]->SaveAs("c:/InetPub/www/test.ppt");
$ppoint->Presentations[1]->Close();
//closing powerpoint
$ppoint->Quit();
//free the object
$ppoint->Release();
$ppoint = null;
-----------------------
?>
the config is :
w2k-server/office2k/iis5/php 4.1.1 isapi
If you happen to run into a working word2k-example, please let me know.
Marc


nospam

The above Word example did not work for me when I tried it using Office 2000. I had to install the Office 2000 SR 2 upgrade to get everything working. It seems that the upgrade fixes some problems with permissions that affect PHP and some other applications that use COM.
David McCormack


halfer

Thanks to paul at completewebservices who added a note earlier; I have used his code to solve a particularly difficult issue with the Crystal 9 runtime component. For some reason, VBA/VBS can pass a native Date type as a parameter to a Crystal Report requiring a date, but in PHP I've tried all manner of strings, unix timestamps, COM variant dates etc and all of these resulted in a com_exception.
My solution was to employ VBScript to borrow the CDate function, which works correctly. Not the most elegant of solutions, but this parameterised approach is to be preferred to search-n-replacing the RecordSelectionFormula string. Of course if anyone here has an even better approach, do post it here - I am sure it would be of use.
<?php
// $rptParam is a report parameter object having a type of date
$oScript = new COM("MSScriptControl.ScriptControl");
$oScript->Language = "VBScript";
$oScript->AllowUI = false;
$oScript->AddObject('rptParam', $rptParam, true);
$oScript->AddCode('Function SetDateParameter(strDate)
rptParam.AddCurrentValue(CDate(strDate))
End Function');
$oScript->Run("SetDateParameter", "25 April 2006");
?>


hwcshirley

Reply to: djogopatrao at gmail dot com
I have change little bit your code. Its work.
$COM_Object = "CrystalDesignRunTime.Application";
$my_report = "C:\\appserv\\www\\mc\\test.rpt";
$my_pdf = "C:\\appserv\www\\mc\\test.pdf";
$crapp= New COM($COM_Object) or die("Unable to Create Object");
$creport = $crapp->OpenReport($my_report, 1);
$creport->ReadRecords(); // attention!
$creport->ExportOptions->DiskFileName=$my_pdf;
$creport->ExportOptions->PDFExportAllPages=true;
$creport->ExportOptions->DestinationType=1; // Export to File
$creport->ExportOptions->FormatType=31; // Type: PDF
$creport->Export(false);


djogopatrao

My previous notes about Crystal Reports have vanished away, but anyway I was up to correct them.
The code above connects to COM (beware of the version number! search on the Registry Editor for the correct name to put in $COM_Object), opens a report from a file ($my_report), reload records from database and then exports it to a PDF file ($my_pdf).
* IMPORTANT * this code, when invoked from the browser (I'm using Apache) AND with a report that connects to a ODBC database, does not work (the problem is specificly the line ReadRecords(), but may arise without it too when data is not saved into the report file).
But when you run this code by PHP-CLI (that is, by the command line), it works ok! I bug-reported this, but have no answer till now ( give it a vote, if you thing it's important: http://bugs.php.net/bug.php?id=36959 ).
Also, exceptions may arise, so put it on a try_catch block.
--------------------------
// by dfcp '06 (djogopatrao@gmail.com)
$COM_Object = "CrystalReports11.ObjectFactory.1";
$my_report = "C:\\report.rpt";
$my_pdf = "C:\\report.pdf";
$ObjectFactory= New COM($COM_Object);
$crapp = $ObjectFactory->CreateObject("CrystalDesignRunTime.Application");
$creport = $crapp->OpenReport($my_report, 1);
$creport->ReadRecords(); // attention!
$creport->ExportOptions->DiskFileName=$my_pdf;
$creport->ExportOptions->PDFExportAllPages=true;
$creport->ExportOptions->DestinationType=1; // Export to File
$creport->ExportOptions->FormatType=31; // Type: PDF
$creport->Export(false);


kmason

It should be noted that to run anything that needs to interact with the UI (the word example), one needs to ensure that the process that the Web server is running under can access the UI.  For Apache, this is an option in the Services control panel.

paul

It seems that PHP does not support setting of properties with arguments.  This is how I got around the problem:
       // Object with method I want to set
       $auth = new COM("AUTHXOCX.AuthXOCXCtrl.1");
       // ScriptControl
       $oScript = new COM("MSScriptControl.ScriptControl");
       $oScript->Language = "VBScript";
       $oScript->AllowUI = TRUE;
       // Add out object to the control
       $oScript->AddObject('auth', $auth, true);
       // Create a VBScript function that allow me to set them
      $oScript->AddCode(
'Function fixAccess(accessname)
   auth.AuthDataReferrerEnabled(accessname) = 1
   auth.AuthDataAuthentiXDBEnabled(accessname) = 0
End Function');
       // Execute function
       $oScript->Run("fixAccess", $dir);


yinon

In order to get the Word exaple running, do the following on the server side.
Worked for me...
1. Click START-->RUN and enter "dcomcnfg"
2. In the "Applications" tab, go down to "Microsoft Word Document"
3. Click PROPERTIES button
4. Go to the "Security" Tab
5. Click "Use custom access permissions", and then click EDIT
6. Click ADD and then click SHOW USERS
7. Highlight the IIS anonymous user account (usually IUSR_<machinename>), click ADD
8. Go back to the "Security" tab by hitting OK
9. Click "Use custom launch permissions", and the click EDIT
10. Click ADD and then click SHOW USERS
11. Highlight the IIS anonymous user account (usually IUSR_<machinename>), click ADD
12. Hit OK, and then hit APPLY.
Also, you should look at the "Identity" tab in the Microsoft Word Document PROPERTIES and see that it is set to "Interactive User"
 
ALSO, log into the machine AS the IUSR_<machinename> account, start word, and make sure to click through the dialog boxes that Word shows the first time it is run for a certain user.  In other words, make sure Word opens cleanly for the IUSR_ user.
More useful information could be found here:
http://www.email-screen.com/support-doc2txt.html


sadi

If your PHP is configured as ISAPI module then the COM object you create in ur php page will use the same memory space as the web server. If your COM object takes too much memory then this may force some COM error as PHP does not handle the memory usage of COM itself. And also Web server doesnt know what do to free COM memory. But if you use PHP as CGI then PHP itself handle the memory usage of COM. Once in a script where i used COM and PHP as ISAPI module i got unknown COM error.But when i used PHP as CGI there was no error. So those who want to use COM object in your application please be careful about it.

mihael peternelj; slovenia

If you wnat to connect to Access MDB Library you can use this small "progy". It works so, that if someone other accesses the library, it waits for so long to access it again because (as i know) MDB librarys can be accessed only once at the same time.
<?php
function mdb($sql, $array = 0, $base = "Base.mdb", $timelimit = 5)
{
$r_items = array();
$c = new COM("ADODB.Connection");
$r = false;
$time = time();
$process = $i = 0;
while($r == false && $process <= $timelimit)
{
$deb = $c->open('DRIVER={Microsoft Access Driver (*.mdb)}; Dbq='. realpath($base) .';');
$r = $c->execute($sql);
$process = time() - $time;
}
if($process >= $timelimit) exit("mdbSQL Query Timeout!");
if(strtolower(substr($sql, 0, 6)) == "insert" or strtolower(substr($sql, 0, 6)) == "update" or strtolower(substr($sql, 0, 6)) == "delete") return true;
$num_fields = $r->fields->count();
while (!$r->EOF)
{
for($j = 0; $j < $num_fields; $j++)
{
$key = $r->Fields($j);
if($array == 0) $r_items[$i][$key->name] = $key->value;
else $r_items[$i][$j] = $key->value;
}
$i++;
$r->MoveNext();
}
$r->close();
$c->close();
$r = null;
$c = null;
return $r_items;
}
?>
I got the source from the Manual, what i did is that i made it more compatible and user frendly. :)
I hope it could some day help someone so as it did me...
Greetings from Slovenia!
Mihael Peternelj


rickardsjoquist

If you want to use a DSN-less connection to a database (access for example) and return the results of a query as a multidimensional array with the fieldnames as identifier try this. Hope it helps someone :-)
--------------------------------------------------------
<?php
function db($sql) {
   $c = new COM("ADODB.Connection");
   $c->open('DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=' . realpath("relative_path/db.mdb"));
   $r = $c->execute($sql);
   $i = 0;
   $num_fields = $r->fields->count();
   while (!$r->EOF)
       {
           for($j = 0;$j<$num_fields;$j++) {
           $key = $r->Fields($j);
           $r_items[$i][$key->name] = $key->value;
       }
       $i++;
       $r->MoveNext();
   }
   $r->close();
   $c->close();
   $r = null;
   $c = null;
   return $r_items;
}
?>
--------------------------------------------------------
use it like this:
--------------------------------------------------------
<?php
$results = db("SELECT field_a, field_b FROM table");
foreach($result as $i => $item) {
   echo $item['field_a'];
   echo $item['field_b'];
}
?>
--------------------------------------------------------
You can also use: print_r($result); if you want the structure of the array to be printed.


phpguy _from_ toshpro _dot_ com

if you ever need to connect to an access database (on the server, using the IIS or APACHE user account), here is code below that can help to ease the process.  It is written like this because we have a MySQL as well as an Access database and need to be able to switch back and forth.  The runQuery function will return a 2 dimensional array and can use column names or numbers for the index of the internal arrays.  External arrays are always integer-indexed.  We also have found issues with Access staying open and growing from 7MB to 2.5GB within two hours, so we open and close it each time we run a query.  If it is not a select query it will return TRUE.  if it fails with errors, it will return false.
There is a showErr flag that we mostly only use for MySQL, since you can output MySQL errors without PHP errors.  Access doesn't appear to be that friendly.
<?php
function runQuery(&$conn,
$strSQL,
$associative=true,
$debug=false,
$showSQL=false,
$showErr=false) {
return runMSQuery($conn,$strSQL,$associative,$debug,$showSQL,$showErr);
//return runMyQuery($conn,$strSQL,$associative,$debug,$showSQL,$showErr);
}
function openMSDB($dbfile="c:/path/and/filename.mdb") {
if (!@$conn = new COM("ADODB.Connection"))
exit("Unable to create an ADODB connection
");
$strConn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".$dbfile;
@$conn->open($strConn);
if($conn->State == 0) return false;
return $conn;
}
function closeMSDB(&$conn) {
@$conn->Close();
$conn = null;
return true;
}
function runMSQuery(&$conn,
$strSQL,
$associative=true,
$debug=false,
$showSQL=false,
$showErr=false) {
if(!is_object($conn)) if(!$conn=openMSDB()) return false;
if( $showSQL || $debug ) echo $strSQL."\n
\n";
$rtn = false;
if($debug) $rs = $conn->execute($strSQL);
else $rs = @$conn->execute($strSQL);
if(!$rs) {
if($showErr) echo "Error running SQL.
\n";
closeMSDB($conn);
return false;
}
if ($rs->State == 0) {
closeMSDB($conn);
return true;
} else {
$rows=0;
while(!$rs->EOF) {
for($i=0;$i<$rs->Fields->count;$i++) {
$rsf = $rs->Fields($i);
if($associative) $rtn[$rows][$rsf->Name] = $rsf->value;
else $rtn[$rows][$i] = $rsf->value;
}
$rows++;
$rs->MoveNext();
}
if($rs->State != 0) $rs->Close();
$rs = null;
}
if($debug) var_dump($rtn);
closeMSDB($conn);
return $rtn;
}
?>


deletethis@bjoern

If you can get the old "TaskScheduler.dll" and register it, it is quite simple to handle and start Windows tasks from PHP.
This is extremely useful when you got things to do which must be run in a different user context. Prepare a task with the user and use PHP & Com to build a webinterface for it.
Here is an example how to start a Windows task:
 function start_task ($taskname) {
   $SchedObj = new COM("Scheduler.SchedulingAgent.1");
   foreach ($SchedObj->Tasks as $task) {
     if (strtolower( (string) $task) == strtolower( $taskname.".job" )) {
        $task->Run();
     }
   }
 }
I'm also working on a class to handle infos, adding and removing of tasks via PHP. If you are interested drop me a line.


flintjt

I have searched for ways to open and read an excel document and I found some information which I thought that I would document.  Information on the object model to help with programming COM objects can be found in your MS Office help files, search for VBA*.chm.
Also, here is a script that I used to pull a cell from each worksheet, complete w/ variable for pathnames & worksheets.  This script also closes excel completely.  The coding might be dirty, but it gets the job done.
--------copy from here-----------
<pre>
<?PHP
$filename = "c:/spreadhseet/test.xls";
$sheet1 = 1;
$sheet2 = "sheet2";
$excel_app = new COM("Excel.application") or Die ("Did not connect");
print "Application name: {$excel_app->Application->value}\n" ;
print "Loaded version: {$excel_app->Application->version}\n";
$Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
$Worksheet = $Workbook->Worksheets($sheet1);
$Worksheet->activate;
$excel_cell = $Worksheet->Range("C4");
$excel_cell->activate;
$excel_result = $excel_cell->value;
print "$excel_result\n";
$Worksheet = $Workbook->Worksheets($sheet2);
$Worksheet->activate;
$excel_cell = $Worksheet->Range("C4");
$excel_cell->activate;
$excel_result = $excel_cell->value;
print "$excel_result\n";
#To close all instances of excel:
$Workbook->Close;
unset($Worksheet);
unset($Workbook);
$excel_app->Workbooks->Close();
$excel_app->Quit();
unset($excel_app);
?>
</pre>
----------------------------------


djogopatrao

I found somewhere (http://www.recrystallize.com/merchant/supportfaq/supportfaq0003.htm) a list relating each version of Crystal Reports to its respective progID - it may help some fellows out there.
7          Crystal.CRPE.Application
8.0        CrystalRuntime.Application or CrystalRuntime.Application.8
8.5        CrystalRuntime.Application or CrystalRuntime.Application.8.5
9 (RDC)    CrystalRuntime.Application.9
9 (RAS)    CrystalReports.ObjectFactory.2
10 (RDC)   CrystalRuntime.Application.11
10 (CEE)   CrystalReports10.ObjectFactory.1

XI (RDC)   CrystalRuntime.Application.11
XI (RAS)   CrystalReports11.ObjectFactory.1


admin

Here's an example/comparison of VBScript vs PHP's COM component to connect to an IIS Webserver.
The examples backup the IIS MetaBase (your server's website(s) configuration) in IIS.
VBScript:
 Dim obj, iFlags
 Set obj = GetObject("IIS://LocalHost")
 ' Backup to next available version number.
 ' Set flags to save the metabase first and
 ' force the backup even if save fails.
 iFlags = (MD_BACKUP_SAVE_FIRST or MD_BACKUP_FORCE_BACKUP)
 obj.Backup "MyBackups", MD_BACKUP_NEXT_VERSION, iFlags
 ' Note: The above was copied from Microbucks.
 ' This is how you would have to do it.
 ' i.e. use the actual constant's value.
 iFlags = (2 or 4)  
 obj.Backup "MyBackups", &HFFFFFFFF, iFlags
PHP:
 <?php
 $obj = new COM("IIS://LocalHost")or die("Unable to instantiate IIS");  
 $err = com_invoke ($obj, "Backup", "MyBackups", "&HFFFFFFFF", 2|4 );
 $obj = null;
 print "err=".$err; // returns 0 on success
 ?>
Glen


jon

Here's a simple example of printing formatted templates with MS Word.
To begin with, I've already built my invoice in Word and saved it as an RTF file.
In this case, I'm using "sampleInvoice.php"
Fields that will be replaced have been marked as ||CUSTOMER ID|| and so on.
<?php
$dataText = "";
// open the file
if(!($fp= fopen ("C:\wordTest\sampleInvoice.rtf", "r"))) die ("Can't open");
$dataText = fread($fp, 2000000);
fclose ($fp);
// replace the template fields
$dataText = str_replace ("||CUSTOMER ID||",$customerIDValue, $dataText);
// save the file as an rtf
$timeStamp = time();
$saveFile = "C:/wordTemp/".$timeStamp."-invoice-".$customerIDValue.".rtf";
if(!($fq= fopen ($saveFile, "w+"))) die ("Can't open");
fwrite ($fq, $dataText);
fclose ($fq);
// initialize the word components
$word = new COM("word.application") or die("Unable to instantiate Word");
print "Loaded word version ($word->Version)\n";
$word->visible = true;
$word->Documents->Add();
// open the file
$word->Documents->Open("$saveFile");
// output the file to the default printer
$word->ActiveDocument->PrintOut(1);
// shutdown word
$word->Quit();
?>


csaba

Getting IE to the foreground
If you are using a command line (CLI) version of PHP on a Win32 platform (e.g. XP Pro, SP2), you might want to have output directed to IE (perhaps you'll want to work with the output there) when Popup does not suffice (see my earlier post, below).
It's easy enough to get an instance of IE using $ie = new COM("InternetExplorer.Application");.  The problem is, you don't necessarily see it in the foreground (especially if you already have one open) and who wants to waste keystrokes getting to it?  The code below has been working for me (If you want to do other adjustments (e.g. $ie->Document->ParentWindow->resizeTo(800,500); or $ie->Document->Body->bgColor = "yellow";), doing them before the $ie->Visible = true; line will avoid screen distractions):
<?php
function newIEtoForeground($title, $evtPrefix="") {
   // brings new instance of IE to foreground with title $title
   if (!$extPrefix) $ie = new COM("InternetExplorer.Application");
   else $ie = new COM("InternetExplorer.Application", $evtPrefix);
   $ie->Navigate2("about:blank");
   $oWSH = new COM("WScript.Shell");
   while ($ie->ReadyState!=4) usleep(10000);
   $ie->Document->Title = ($tmpTitle = mt_rand());  //unique title
   $ie->Visible = true;
   while (!$oWSH->AppActivate("$tmpTitle - M")) usleep(10000);
   $ie->Document->Title = $title;
   $ie->Document->ParentWindow->opener="me";  // allows self.close()
   return $ie;
}
?>
Csaba Gabor from Vienna


jbr

Getting * directory * permissions ( attributes ) with COM
PHP (5) example...
<?
$dir = 'e:/www/docs/www/docs/junk/';
define ( 'READ_ONLY', 1 );
define ( 'IS_HIDDEN', 2 );
define ( 'IS_SYSTEM', 4 );
$hold = array ();
$obj = new COM ( 'scripting.filesystemobject' );
if ( is_object ( $obj ) )
{
$all = $obj->getfolder ( $dir );
foreach ( $all->subfolders AS $directory )
{
if ( substr ( $directory->name, - 3 ) != 'cnf' )
{
$hold[$dir . $directory->name . '/'] =  array ( 'read_only' => ( ( $directory->Attributes & READ_ONLY ) <> 0 ? 1 : 0 ), 'is_hidden' => ( ( $directory->Attributes & IS_HIDDEN ) <> 0 ? 1 : 0 ), 'is_system' => ( ( $directory->Attributes & IS_SYSTEM ) <> 0 ? 1 : 0 ) );
}
}
$obj = null;
}
else
{
echo 'sorry can not crate object: file_system_object';
}
print_r ( $hold );
?>
To do the same thing for * files * with in the directory named in $dir, change above ( foreach() ) to what is below...
foreach ( $all->files AS $file )
{
$hold[$file->name] =  array ( 'read_only' => ( ( $file->Attributes & READ_ONLY ) <> 0 ? 1 : 0 ), 'is_hidden' => ( ( $file->Attributes & IS_HIDDEN ) <> 0 ? 1 : 0 ), 'is_system' => ( ( $file->Attributes & IS_SYSTEM ) <> 0 ? 1 : 0 ) );
}
pretty much anything you could think of doing in windows can be done using PHP and COM...
John


sodeh

for connection to sql server and know the utf-8 code
use this method to connect the database
$db = new COM("ADODB.Connection",NULL, 65001 );


franky

For Access to Ms Access
use another Provider like this:
<?php
$conn = new COM("ADODB.Connection")
or die("Cannot start ADO");
$conn->Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=./thefile.mdb;");
$rs = $conn->Execute("SELECT * FROM thetable");
?>


20-sep-2003 06:49

Example on how to read a registry value:
<?php
 $shell= &new COM('WScript.Shell');
 var_dump($shell->regRead('HKEY_CURRENT_USER\Environment\TEMP'));
?>
(outputs string(39) "%USERPROFILE%\Lokale Einstellungen\Temp" on my system)


drich

Changing Fields (Not FORMFIELDS) In MS Word....
Searched most of the afternoon for this, as it is something needed here for our projects.  Maybe this can help someone else as well.
<?php
$input = "x:\\path\\to\\test.doc";
$word = @new COM("word.application") or die("Unable to instantiate Word");
print "Loaded Word, version {$word->Version}\n
";
$word->Visible = 1;
print "Set Word To Visible
";
$word->Documents->Open($input);
print "Opened $input
";
$word->Activate;
print "Activated Word
";
print "Editing Fields
";
$Field = $word->ActiveDocument->Fields(1);
$fieldData = $Field->Result;
$fieldData->Text = "Testing";
// Print the document.
$word->Printout();
// closing word
$word->Quit();
// free the object
$word->Release();
$word = null;
?>


jnv

Be sure you have Word, Excel, .. on your server or it will not work !

csaba

Basic Windows IO
If you are using a command line (CLI) version of PHP on a Win32 platform, you might like to have a simple graphical interface to get input and output.  The following gives an illustration for both.
<?php
   // first we get some input
   $oScript = new COM("MSScriptControl.ScriptControl");
   $oScript->Language = "VBScript";
   $title = "I/O Demo: Input half";
   $initial = "Change this value";
   $prompt = "Please enter a value";
   
   $code = <<<EOF
Function getInput()
   inVal = InputBox("$prompt", "$title", "$initial")
   getInput = inVal     'how return values are assigned in VB
End Function
EOF;
   $oScript->AddCode($code);
   $input = $oScript->Eval("getInput()");
   if (gettype($input)=="NULL") $input = "Input box was cancelled";
   // now we show some output
   $oWSH = new COM("WScript.Shell");
   $title = "I/O Demo: Output half";
   $timeout = 2; // 0 for no timeout
   $style = 0 + 48; // buttons to show + alert symbol
   $oWSH->Popup($input, $timeout, $title, $style);
?>
This is example is overblown for illustrative purposes.  The whole input part collapses if the amount of code used is a single statement.  So, this would have sufficed:
$code = "InputBox(\"$prompt\", \"$title\", \"$initial\")";
$input = $oScript->Eval($code);
This technique exposes quite a bit of scripting power tied into the Windows operating system and VBScript.  However, you should have a really specific reason for using it since VBScript tends to be dog slow when compared to PHP in my tests.  Simple IO like this is good, however, and the popup size can be quite large.  Furthermore, this could be a viable route to go for accessing WinAPI's.
http://www.ss64.com/wsh/popup.html shows some documentation for $oWSH->Popup
Csaba Gabor from Vienna


eguan1ao_at_yahoo_dot_com

An example of connecting to a Microsoft Access database, executing an SQL query, and displaying the results in HTML.
<?php
$db = 'C:\\Program Files\\Microsoft Office\\Office\\Samples\\Northwind.mdb';
$conn = new COM('ADODB.Connection');
// Two ways to connect. Choose one.
$conn->Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=$db");
//$conn->Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$db");
$sql = 'SELECT   ProductName, QuantityPerUnit, UnitPrice
        FROM     Products
         ORDER BY ProductName';
$rs = $conn->Execute($sql);
?>
<table>
<tr>
         <th>Product Name</th>
        <th>Quantity Per Unit</th>
        <th>Unit Price</th>
</tr>
<?php while (!$rs->EOF): ?>
        <tr>
                 <td><?= $rs->Fields['ProductName']->Value ?></td>
                  <td><?= $rs->Fields['QuantityPerUnit']->Value ?></td>
                 <td><?= $rs->Fields['UnitPrice']->Value ?></td>
         </tr>
        <?php $rs->MoveNext() ?>
<?php endwhile ?>
</table>
<?php
$rs->Close();
$conn->Close();
?>


info

<?php
// An other way to connect
// this connect to a ODBC-datasourced added in the
// ODBC Data Source Administrator under System DSN
$odbcname = "northwind";
$conn->Open("DSN=$odbcname");
?>


jbr

"Keeping an instance of a Server object loaded"
When dealing with COM objects like 'Word' or 'Excel' you are pretty
much dealing with personal COM type objects. The reason I say this
is because they in no way have any direct relationship to a real COM
server object. The differences between a 'Server COM Object' and a
'Personal COM Type Object' are great. Server COM objects, do not contain
and properties or methods related to any type of program dialog.
Most Enterprise COM objects are designed to run under IIS where they
are loaded into the server process. So once the first instance call is
made or when the server is started the object loads it properties, methods
and data related to the service the object provides!
Many objects load large data set(s) 10 MB to 200 MB into memory, this makes
any process after the initial loading of the object fast and very system
friendly!
In PHP, when an initial instance of an object is loaded some where in a
PHP script, PHP will check if an instance of the object is already running
if it is, then it will use that instance. If it can not find an instance to
the object running, it will create a new instance to the object!
In the case of personal COM type objects, you can point to a running instance
of an object, and reference that instance...
<?
$obj = new COM ( 'X:\reports\june.doc' );
?>
For Server type COM objects that load large data set(s), you really have no option
because each script run will unload the instance at the end of the script's run time.
Unless another http request is running and the new http request can access the other
object instance, you will have to load all the objects properties and methods and data
set(s) used by the object!
One way to work around this is to write a wrapper that can load the object into the
PHP or the Server process! I did this for the objects I use.
Another unorthodox way is to load your web browser to a PHP script that uses a combination
of ignore_user_abort(), set_time_limit(), load the object, sleep();!
Before I wrote the wrapper for a 'Map Server Object' I use in one of my project. I used
the 'unorthodox way' for almost a year and had over 15,000 object requests a day, and
never did the instance of the object ever have to start a new instance, ie: reload all the properties and methods and data
set(s) used by the object!
Like I said this is a very 'unorthodox way' to keep an object loaded, but it works!
set the object 'My.Object' in the script, call the script from the browser, then close the browser!
<?
ignore_user_abort ( 'true' );
set_time_limit ( 0 );
com_load_typelib ( 'My.Object' ) or die ( 'Could not load TypeLib' );
$obj = new COM ( 'My.Object' ) or die ( 'Could not load object' );
$obj = null;
sleep ( 63166608000 ); // one year
?>
John


Change Language


Follow Navioo On Twitter
COM
DOTNET
VARIANT
com_addref
com_create_guid
com_event_sink
com_get_active_object
com_get
com_invoke
com_isenum
com_load_typelib
com_load
com_message_pump
com_print_typeinfo
com_propget
com_propput
com_propset
com_release
com_set
variant_abs
variant_add
variant_and
variant_cast
variant_cat
variant_cmp
variant_date_from_timestamp
variant_date_to_timestamp
variant_div
variant_eqv
variant_fix
variant_get_type
variant_idiv
variant_imp
variant_int
variant_mod
variant_mul
variant_neg
variant_not
variant_or
variant_pow
variant_round
variant_set_type
variant_set
variant_sub
variant_xor
eXTReMe Tracker