在PHP中使用DLL?

时间:2009-07-07 23:09:31

标签: php com dll

我不会撒谎。我并不熟悉Windows和COM对象。这就是我在这里的原因。首先是可以从用完Apache的PHP脚本中访问DLL吗?在我的互联网之旅中,我相信我有两个选择:

  1. 将dll编译为PHP的扩展。 (我没有制作这个dll)
  2. 将DLL作为COM对象访问,这是它的设计方式。
  3. 所以我采用COM方法。

    try{
      $com = new COM('WHAT_GOES_HERE');
    } catch(Exception $e){
        echo 'error: ' . $e->getMessage(), "\n";
    }
    

    如何查找初始化字符串中的内容?是否有一个com查看器类型程序我可以/应该用来找到它?与此DLL相关联的文档似乎并未指定我应该使用哪些字符串进行初始化,而是深入了解可用的流以及各种有趣的内容。刚刚过了这个初期的驼峰。请帮忙!

3 个答案:

答案 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函数的标题自动为您生成此包装器。我自己使用这种方法,它简单可靠。

相关问题