com_load_typelib

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

com_load_typelib加载类型库

描述

com_load_typelib(string $typelib, bool $case_insensitive = true): bool

加载类型库并将它的常量注册到引擎中,就好像它们是使用 define() 定义的一样。

请注意,使用 com.typelib-file php.ini 设置预加载和注册常量效率更高,尽管没有那么灵活。

如果 com.autoregister-typelib 处于启用状态,那么当您实例化 COM 对象时,PHP 将尝试自动注册与该对象关联的常量。这取决于 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 年前
我对一些第三方 Word 控制代码遇到了一些问题,这些代码与 Richard 的示例有点类似。(Word 2007 SP1,XP SP2。)根据该示例重写了一些部分,但没有成功。Word 的错误消息很奇怪

"错误的参数" - 它不喜欢 wdGoToBookmark,但可以接受它的数字等效值 -1;

"调用了未定义的方法 variant::SaveAs()" - 保存() 也是如此,它在我的情况下很适合,因此没有其他选择。

但后来我在命令行中通过 php.exe 运行了该示例,它运行成功了!最终发现,Apache 服务必须以某个真实用户身份运行,而不是以 SYSTEM 身份运行。
RQuadling at GMail dot com
16 年前
一些库在它们的功能的一部分中加载其他库。例如,Crystal Reports 对象工厂使用 CreateObject() 方法来创建一个 Crystal Design RunTime 应用程序的实例。如果要使用新加载的库中定义的常量,则需要手动注册该库 - 即使 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
'Will not be defined : ', crOpenReportByDefault, PHP_EOL;

com_load_typelib('CrystalDesignRunTime.Application');

echo
'Will now be defined : ', crOpenReportByDefault, PHP_EOL;
?>

输出...

com.autoregister_typelib = 1
未定义
注意:在 C:\refl.php 第 8 行使用未定义的常量 crOpenReportByDefault - 假设为 'crOpenReportByDefault'
crOpenReportByDefault
现在已定义:0
匿名
20 年前
如果您想知道 com_load_typelib 到底做了什么,我发现它加载了 COM 对象定义的常量/枚举。以下示例使用 Nero COM 对象(来自 Nero Burning rom,版本 6+)。Nero 对象定义了一堆常量,但除非使用上面提到的函数,否则不能将它们用作 PHP 常量。因此,以下示例将正常运行

<?php
$aNero
= new COM("Nero.Nero") or die ("Nero didn't load, too bad");
com_load_typelib("Nero.Nero");
$aNero->GetDrives(NERO_MEDIA_CD);
?>

但此示例将无法运行,因为 PHP 将返回一条消息,提示常量未定义

<?php
$aNero
= new COM("Nero.Nero") or die ("Nero didn't load, too bad");
$aNero->GetDrives(NERO_MEDIA_CD);
?>

弄清楚这一点花了我一段时间,希望它能帮到您。

此外,请查看 https://php.net/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";

// 使用您的姓名和年龄书签打开一个新文档。
$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