2011-12-21 75 views
12

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

我看了网络上的多个答案像

这是我如何调用HTA/Javascript的DLL:

<object style="display:none" id="SOME_ID" classid="clsid:SOME_CLASS_ID" codebase="./somePath.dll"></object>

是否有人有一个工作的例子吗?

这是我在PHP到目前为止已经试过:

$obj = new COM('pathTo.dll'); 

在DLL信息:

  1. 采用Delphi
  2. 它(当然)自制
  3. 编译当我尝试注册DLL时,出现以下错误the DllRegister Server entry point was not foundregsvr32

可以注册使用regsvr32吗?

+0

什么是你的COM类的CLSID?我怀疑你没有创建一个准备好用于COM互操作的DLL ... – 2011-12-21 13:38:01

+0

我在这个主题上读过的所有东西都告诉我,要做到这一点的方法是编写一个C++封装器,用于可以内置到PHP中的DLL扩展名,并以这种方式使用它。我从来没有试过这样做,也不能告诉你怎么做,但是我之前遇到过这个问题(你链接到几个人问同样的问题),我从来没有见过任何人说过“我已经开始工作了”除非他们建立了扩展。 – DaveRandom 2011-12-21 13:41:03

+0

@ThorstenDittmar CLSID是一个字符串AlphaNumeric字符串,格式为XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX。你是什​​么意思的DLL准备COM互操作 – 2011-12-21 13:41:29

回答

9

当你创建你的DLL文件时,你需要使用一个module definition file。它会包含类似这样的东西:

; 
;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一起使用。不显示任何消息框(在Windows XP和Windows Vista添加)

最终,你尽量让用PHP DLL工作之前,你需要确保你的DLL一般的作品。

2

DLL无法从Linux/Apache服务器访问。因此该项目下降。

0

我有同样的问题,我固定的一些步骤:

  1. 管理员打开命令行权(窗口+ R +键入“cmd”) 写,你是你的DLL文件的路径:
    C:\Windows\system32>regsvr32 xwizards.dll(它的例子)
    一个窗口 “的DLLRegisterServer成功”
  2. 检查您的phpinfo()显示,如果你com_dotnet扩展
  3. 写信到你的PHP代码:

    try { 
        $dll = new COM('<theNameOfDllFile>.<NameOfTheClass>'); //without extension '.dll' for theNameOfDllFile 
        $dll->Function(); 
        } catch(Exception $e){ 
        echo 'error: ' . $e->getMessage(), "\n";} 
    

    现在,如果你知道如何管理类和你的函数是DLL它会好的,但是没有错误的按摩应该出现在屏幕上


如果我没说清楚,让我知道,我会尽我所能,下一次:)