Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将DLL与PHP一起用于虚拟对象_Php_Dll_Xampp_Ocx - Fatal编程技术网

将DLL与PHP一起用于虚拟对象

将DLL与PHP一起用于虚拟对象,php,dll,xampp,ocx,Php,Dll,Xampp,Ocx,我有一个项目,需要使用PHP访问DLL。服务器是一台Windows机器,Apache服务器由XAMPP提供 我在网上读了很多答案,就像 下面是我在HTA/Javascript中调用DLL的方法: 有人有一个有效的例子吗? 以下是我迄今为止在PHP中尝试的内容: $obj = new COM('pathTo.dll'); 有关DLL的信息: 用Delphi编译 它(当然)是国产的 当我试图用regsvr32 是否可以在不向regsvr32注册的情况下使用它?当您创建DLL文件时

我有一个项目,需要使用PHP访问DLL。服务器是一台Windows机器,Apache服务器由XAMPP提供

我在网上读了很多答案,就像

下面是我在
HTA
/
Javascript
中调用DLL的方法:

有人有一个有效的例子吗?

以下是我迄今为止在PHP中尝试的内容:

$obj = new COM('pathTo.dll');
有关DLL的信息:

  • 用Delphi编译
  • 它(当然)是国产的
  • 当我试图用
    regsvr32

  • 是否可以在不向regsvr32注册的情况下使用它?

    当您创建DLL文件时,需要使用。它将包含类似以下内容:

    ;
    ;contains the list of functions that are being exported from this DLL
    ;
    
    DESCRIPTION     "Simple COM object"
    
    EXPORTS
                    DllGetClassObject       PRIVATE
                    DllCanUnloadNow         PRIVATE
                    DllRegisterServer       PRIVATE
                    DllUnregisterServer     PRIVATE
    
    该定义允许regsvr32查找DllRegisterServer入口点

    您可以尝试的另一个选项是将/n标志传递给regsvr32

    Regsvr32[/u][/n][/i[:cmdline]]dllname

    /u-取消注册服务器

    /i-调用DllInstall并向其传递可选的[cmdline];与/u调用一起使用时,dll卸载

    /n-不要调用DllRegisterServer;此选项必须与/i一起使用

    /s——沉默;不显示消息框(随Windows XP和Windows Vista一起添加)


    最后,在您尝试使用PHP使DLL工作之前,您需要确保您的DLL正常工作。

    无法从Linux/Apache服务器访问DLL。因此,项目被删除。

    我也遇到了同样的问题,我修复了一些步骤:

  • 在管理员权限下打开命令行(windows+r+键入“cmd”) 写入dll文件所在的路径:
    C:\Windows\system32\regsvr32 xwizards.dll
    (这是一个示例)
    一个窗口显示为“DLLRegisterServer success”
  • 如果您是com\u dotnet扩展,请检查您的phpinfo()
  • 现在在PHP代码中写入:

        try    {
      $dll = new COM('<theNameOfDllFile>.<NameOfTheClass>'); //without extension '.dll' for theNameOfDllFile
      $dll->Function(); 
      } catch(Exception $e){
        echo 'error: ' . $e->getMessage(), "\n";}
    
    试试看{
    $dll=new COM('.');//不带扩展名.dll,用于nameofdll文件
    $dll->Function();
    }捕获(例外$e){
    回显“错误:”。$e->getMessage(),“\n”;}
    
    现在,如果您知道如何管理您的dll的类和函数,一切正常,但是屏幕上不应显示错误信息



  • 如果我不清楚,请告诉我,下次我会尽力而为:)

    您的COM类的CLSID是多少?我怀疑您没有为COM互操作创建一个DLL……我在这个主题上所读到的所有内容都告诉我,这样做的方法是为DLL编写一个C++包,它可以被构建到PHP扩展中,并用它来实现。我从来没有尝试过这样做,也不能告诉你怎么做,但我以前遇到过这个问题(你联系了几个问同样问题的人),我从来没有看到有人说“我让它工作了”除非他们构建了一个扩展。@ThorstenDittmar
    CLSID
    是一个字符串字母数字字符串,格式如下XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXX。你所说的为COM准备的DLL是什么意思interop@DavidLaberge
    CLSID
    在技术上是一个,在这个上下文中使用时可能需要包装在
    {}
    中。从我在链接和您的问题中看到的情况来看,您必须向系统注册DLL,并注册一个COM类,然后可以从PHP使用。如果你不这样做,那就行不通了。你能提供更多的细节,或者一个有效的例子吗?我已经到了不再说“无法打开文件”的地步。现在它只是说“类未注册”。所以我更接近解决方案了。我正在使用.NET DLL。此方法导致读取错误:未能创建COM对象“dllName.dllClass”:无效语法。你能就这个错误的原因提出建议吗?“服务器是Windows机器,Apache服务器由XAMPP提供。”这根本不是关于Linux的。Linux上可以使用DLL,你可以从PHP调用Wine(shell_exec()、proc_open()等)