2024 日本 PHP 研討會

com_load_typelib

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

com_load_typelib載入類型程式庫

說明

com_load_typelib(字串 $typelib, 布林值 $case_insensitive = true): 布林值

載入類型程式庫並將其常數註冊到引擎中,如同使用 define() 定義它們一樣。

請注意,使用 com.typelib-file php.ini 設定來預先載入和註冊常數效率更高,儘管不夠靈活。

如果啟用了 com.autoregister-typelib,則 PHP 會在您實例化 COM 物件時嘗試自動註冊與之關聯的常數。這取決於 COM 物件本身提供的介面,而且可能並非總是可行。

參數

typelib

typelib 可以是以下其中之一

  • .tlb 檔案的檔名或包含類型程式庫的可執行模組。

  • 類型程式庫 GUID,後跟其版本號,例如 {00000200-0000-0010-8000-00AA006D2EA4},2,0

  • 類型程式庫名稱,例如 Microsoft OLE DB ActiveX Data Objects 1.0 Library

PHP 將會嘗試按照此順序解析類型程式庫,因為隨著您在列表中往下移動,處理過程會越來越耗費資源;按名稱搜尋類型程式庫是透過實際列舉登錄檔直到找到相符的項目來處理的。

case_insensitive

case_insensitive 的行為與 define() 函式中的參數 $case_insensitive 相反。

傳回值

成功時傳回 true,失敗時傳回 false

新增註解

使用者貢獻的註解 5 則註解

tomas dot burba at softneta dot lt
12 年前
我在使用與 Richard 的範例有點類似的第三方 Word 控制程式碼時遇到了一些問題。(Word 2007 SP1, XP SP2。) 根據該範例重寫了一些部分,但沒有成功。Word 的錯誤訊息很奇怪

「參數錯誤」-- 它不喜歡 wdGoToBookmark,但可以使用其數值等效值 -1;

「呼叫未定義的方法 variant::SaveAs()」-- 與 Save() 相同,這在我的情況下適用,因此沒有其他選項。

但後來我透過命令列中的 php.exe 執行該範例,它就成功了!最終發現 Apache 服務必須以實際使用者身分執行,而不是以 SYSTEM 身分執行。
RQuadling at GMail dot com
16 年前
某些程式庫會載入其他程式庫作為其功能的一部分。例如,Crystal Reports Object Factory 使用 CreateObject() 方法來建立 Crystal Design RunTime Application 的實例。如果您想使用在新載入的程式庫中定義的常數,則需要手動註冊該程式庫,即使 com.autoregister_typelib 設定為 true 也一樣。

<?php
echo 'com.autoregister_typelib = ', ini_get('com.autoregister_typelib'), PHP_EOL;

$o_CrObjectFactory = New COM('CrystalReports11.ObjectFactory.1');

$o_CrApplication = $o_CrObjectFactory->CreateObject("CrystalDesignRunTime.Application");

echo
'尚未定義:', crOpenReportByDefault, PHP_EOL;

com_load_typelib('CrystalDesignRunTime.Application');

echo
'現在已定義:', crOpenReportByDefault, PHP_EOL;
?>

輸出...

com.autoregister_typelib = 1
尚未定義
注意:使用了未定義的常數 crOpenReportByDefault - 假設為 'crOpenReportByDefault',位於 C:\refl.php 的第 8 行
crOpenReportByDefault
現在已定義:0
匿名
20 年前
如果您想知道 com_load_typelib 實際上的作用,我發現它會載入 COM 物件已定義的常數\列舉。以下範例使用 Nero COM 物件(來自 Nero Burning rom,版本 6+)。Nero 物件定義了一堆常數,但除非您使用上述函式,否則它們不能用作 PHP 常數。因此,以下範例可以正常運作

<?php
$aNero
= new COM("Nero.Nero") or die ("Nero 載入失敗,真糟糕");
com_load_typelib("Nero.Nero");
$aNero->GetDrives(NERO_MEDIA_CD);
?>

但這個範例將無法運作,因為 PHP 會傳回一條訊息,指出常數未定義

<?php
$aNero
= new COM("Nero.Nero") or die ("Nero 載入失敗,真糟糕");
$aNero->GetDrives(NERO_MEDIA_CD);
?>

我花了一段時間才弄清楚這一點,希望它有所幫助。

另請參閱 https://php.dev.org.tw/manual/en/faq.com.php 以了解如何在 PHP 中使用 COM 事件。
ojpp at webdevfm dot com
20 年前
各位 PHP 社群的成員們好,我想協助解決我在這個 COM 內建函式 com_load_typelib() 中發現的問題:當我執行它來開啟 COM 伺服器程序(例如:Word、Excel 等)時,我無法從記憶體中釋放物件,我想到了解決方案,如下所示

更改 php.ini 中的設定

; 在 com_load() 時自動註冊組件類型程式庫的常數
com.autoregister_typelib = true

當 com.autoregister_typelib 指令為 true 時,PHP 解析器會管理 COM 伺服器類型程式庫,希望這能有所幫助。
richard dot quadling at carval dot co dot uk
21 年前
<?php
// 有些伺服器可能有自動逾時,所以請自行設定您需要的時間。
set_time_limit(0);

// 開發時顯示所有錯誤、警告和注意事項。
error_reporting(E_ALL);

// 在某些 COM 函式中,當不需要參數時,用作佔位符。
$empty = new VARIANT();

// 載入適當的類型程式庫。
com_load_typelib('Word.Application');

// 建立要使用的物件。
$word = new COM('word.application') or die('無法載入 Word');
print
"已載入 Word,版本 {$word->Version}\n";

// 開啟一個包含 YourName 和 YourAge 書籤的新文件。
$word->Documents->Open('C:/Unfilled.DOC');

// 從表單填入資訊。
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // 注意 wdGoToBookmark 的使用,來自類型程式庫和 $empty 的使用。
$word->Selection->TypeText($_GET['YourName']);

$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourAge');
$word->Selection->TypeText($_GET['YourAge']);

// 儲存檔案、關閉 Word 並結束。
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc");
$word->Quit();
$word->Release();
$word = null;
print
"Word 已關閉。\n";
?>

範例文件是……

您好 [YourName 的書籤],您今年 [YourAge 的書籤] 歲。

它會被稱為……

word.php?YourName=Richard%20Quadling&YourAge=35

此致,

Richard.
To Top