PHP Conference Japan 2024

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 启用,则当您实例化 COM 对象时,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 条注释

0
tomas dot burba at softneta dot lt
12 年前
我在处理一些第三方 Word 控制代码时遇到了一些问题,这些代码与 Richard 的示例有些类似。(Word 2007 SP1,XP SP2。)根据该示例重写了一些部分,但没有解决。Word 的错误消息很奇怪

“参数错误”——它不喜欢 wdGoToBookmark,但可以接受其数字等效项 -1;

“调用未定义的方法 variant::SaveAs()”——与 Save() 相同,在我的情况下是合适的,因此没有剩余选项。

但随后我在命令行中通过 php.exe 运行了该示例,并且它成功了!最终发现 Apache 服务必须以某些真实用户而不是 SYSTEM 的身份运行。
0
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
Will not be defined
Notice: Use of undefined constant crOpenReportByDefault - assumed 'crOpenReportByDefault' in C:\refl.php on line 8
crOpenReportByDefault
Will now be defined : 0
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 事件工作。
0
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 服务器类型库,希望对您有所帮助。
-1
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