我不会撒谎。我并不熟悉Windows和COM对象。这就是我在这里的原因。首先是可以从用完Apache的PHP脚本中访问DLL吗?在我的互联网之旅中,我相信我有两个选择:
所以我采用COM方法。
try{
$com = new COM('WHAT_GOES_HERE');
} catch(Exception $e){
echo 'error: ' . $e->getMessage(), "\n";
}
如何查找初始化字符串中的内容?是否有一个com查看器类型程序我可以/应该用来找到它?与此DLL相关联的文档似乎并未指定我应该使用哪些字符串进行初始化,而是深入了解可用的流以及各种有趣的内容。刚刚过了这个初期的驼峰。请帮忙!
答案 0 :(得分:5)
WHAT_GOES_HERE
是在操作系统上注册的ProgID,Class ID或Moniker。
对于在不同计算机上注册的相同DLL,每个都可以更改。有几种方法可以找到注册dll的ProgID / CLSID / Moniker。你可以在网上搜索“dll debugger”,“dll export”,“dll inspect”,你会看到几个解决方案,以及显示dll导出的功能的方法,以便你可以使用它们。
最简单的方法是,您可以使用Regsvr32.exe注册dll并使用regedit.exe搜索Window的寄存器以获取dll的名称,您可能需要多次搜索,直到找到\HKEY_CLASSES_ROOT\
下的密钥,是ProgID。
命令dcomcnfg.exe显示有关COM对象的大量信息。
如果您有Visual Studio,则OLE / COM对象查看器(oleview.exe)可能很有用。
答案 1 :(得分:3)
您可以使用winbinder运行dll函数(来自不是php扩展的dll)。 http://winbinder.org/ 使用它很简单。你必须下载php_winbinder.dll并将其作为扩展名包含在php.ini中。 在php脚本中你必须使用类似的东西:
function callDll($func, $param = "")
{
static $dll = null;
static $funcAddr = null;
if ($dll === null)
{
$dll = wb_load_library(<DLL PATH AND FILENAME>);
}
$funcAddr = wb_get_function_address($func, $dll);
if ($param != "")
{
return wb_call_function($funcAddr,array(mb_convert_encoding($param,"UTF-16LE")));
}
else
{
return wb_call_function($funcAddr);
}
}
答案 2 :(得分:2)
您可以简单地在主dll周围开发一个包装器,并将此包装器用作PHP中的扩展。某些免费工具(如SWIG)可以通过获取dll函数的标题自动为您生成此包装器。我自己使用这种方法,它简单可靠。