2006年5月10日 星期三

進階PHP程式設計-php與 COM




  • COM


在微軟的架構中,有一個著名的技術稱做COM(Component Object Model),本篇文章先不從技術面探討,而是從應用面。微軟大部分的產品都具備COM的能力,不管是什麼程式,都按照COM的介面Type Lib來開發。造成微軟的所有產品,下到OS,上到自己開發的應用程式(如果照著COM的架構設計),都可以藉由COM架構進行溝通。舉例說你可以利用IE呼叫Word或是任何語言所撰寫的ActiveXObject,這便是所謂的ActiveX技術。或是在Excel中嵌入一個IE,並且控制IE內部的任何物件,甚至是HTML物件,這是所謂的OLE Automation技術。可以瞥見這些技術都來自於COM。



這樣好用且擴充性高的架構,造成微軟產品都具有相當高的整合度,不過也同時產生問題。例如說在IE中隨便使用Javascript寫一個迴圈產生很多次數的Word Object,便能夠造成用戶端的DoS(阻斷服務)攻擊,導致用戶端的記憶體爆滿而無法正常運作。例如近年來都可以看到Windows不斷在釋出DCOM的修正檔,而且由於這些修正檔,一些沒有權限的帳號(例如屬於Guests群組的任何帳號)都會無法任意使用COM來和應用程式溝通。有關IE和Javascript(或VBScript)的DoS攻擊,你可以參考下列的連結:

http://www.securityfocus.com/bid/4463

這是一個很老舊的例子,IE現在的版本不會有這問題。

  • PHP和COM


為了在Windows平台上達到使用微軟產品的能力,PHP4的時候開始有了COM/DCOM的支援。
以下是一個簡單的例子
[code lang="php"]
// starting word
$word = new COM("word.application") or die("Unable to instanciate Word");
print "Loaded Word, version {$word->Version}\n";

// bring it to front
$word->Visible = 1;
//this is for example a printer on my network

// Open a word document, or anything else that word
// can read
$input ="c:\\test.html";
$word->Documents->Open($input);

// closing word
$word->Documents[1]->Close(false);
$word->Quit();

// free the object
$word = null;
unset($word);
?>
[/code]

因為使用相同的介面呼叫,程式設計師便直接參考微軟官方的Office VBA Reference就可以了。在php5的時候更簡化了一些COM物件的控制方式,例如以下程式碼:
[code lang="php"]
$domainObject = new COM("WinNT://Domain");
foreach ($domainObject as $obj) {
echo $obj->Name . "
";
}
?>
[/code]
集合物件可以快速地使用foreach來疊代。

沒有留言 :

張貼留言