PHP (Windows) → COM 介面 → VB6 ActiveX DLL (在進程內執行) → 商務邏輯。適用於整合舊有 VB6 元件、呼叫 Windows 系統功能、Office 自動化等場景。
P_test,類別模組名 c_test。ScriptingContext 等介面)。Option Explicit
Private MyScriptingContext As ScriptingContext
Private MyApplication As Application
Private MyRequest As Request
Private MyResponse As Response
Private MyServer As Server
Private MySession As Session
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
Set MyApplication = MyScriptingContext.Application
Set MyRequest = MyScriptingContext.Request
Set MyResponse = MyScriptingContext.Response
Set MyServer = MyScriptingContext.Server
Set MySession = MyScriptingContext.Session
End Sub
Public Sub OnEndPage()
Set MyScriptingContext = Nothing
Set MyApplication = Nothing
Set MyRequest = Nothing
Set MyResponse = Nothing
Set MyServer = Nothing
Set MySession = Nothing
End Sub
Public Function Test_Number(num) As Variant
If num < 0 Then Test_Number = -1
If num > 0 Then Test_Number = 1
If num = 0 Then Test_Number = 0
End Function
P_test.dll。regsvr32 P_test.dll (需管理員權限)。<?php
$com = new COM("P_test.c_test");
$result = $com->Test_Number(-454);
echo $result; // 輸出 -1
?>
| 項目 | 說明 |
|---|---|
| COM 類別識別 | ProgID: ProjectName.ClassName (此處 P_test.c_test),或 CLSID GUID |
| ASP 相容介面 | OnStartPage/OnEndPage 讓 DLL 存取 ASP 內建物件,PHP 呼叫時不需要但保留無妨 |
| 資料類型對應 | VB Variant ↔ PHP mixed,基本類型自動封送 |
| 錯誤處理 | PHP 端捕捉 com_exception,VB 端 Err.Raise |
| 效能 | In-process (DLL) 呼叫極快,但 PHP 進程崩潰風險共擔;Out-of-process (EXE) 隔離性好但序列化開銷大 |
| 部署 | 目標機需註冊 DLL、相容 VB6 執行階段 (Windows 內建)、PHP com.allow_dcom=On (php.ini) |
regsvr32 失敗、32/64 位元不匹配 (PHP 32bit 需 32bit DLL、在 64bit OS 用 %windir%\SysWOW64\regsvr32.exe)。On Error Goto ErrHandler。HKCR\CLSID\{...} 讀取權限。COM 或 dotnet 擴展呼叫 (需 php_dotnet.dll),或改用 REST/gRPC 微服務化。exec() 呼叫 PowerShell/CMD、proc_open()、ffi 擴展 (PHP 7.4+) 直接呼叫 C DLL。PHP-COM-VB6 互操作是企業級系統整合舊資產的經典方案,展示了 COM 二進位介面標準的跨語言威力。隨著 VB6 終止支援、PHP 現代化、微服務架構普及,新專案應避免此架構,既有系統應規劃遷移路徑。