2011-12-21 72 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它會好的,但是沒有錯誤的按摩應該出現在屏幕上


如果我沒說清楚,讓我知道,我會盡我所能,下一次:)