首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 呼叫自製 COM 元件:VB6 ActiveX DLL 互操作完整教學

     編輯:PHP 相關知識

架構概覽

PHP (Windows) → COM 介面 → VB6 ActiveX DLL (在進程內執行) → 商務邏輯。適用於整合舊有 VB6 元件、呼叫 Windows 系統功能、Office 自動化等場景。

VB6 ActiveX DLL 專案建立

  1. 新建「ActiveX DLL」專案,專案名 P_test,類別模組名 c_test。
  2. 加入參考:「Microsoft Active Server Pages Object Library」(關鍵,提供 ScriptingContext 等介面)。
  3. 類別程式碼:
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
  1. 編譯產生 P_test.dll。
  2. 註冊:regsvr32 P_test.dll (需管理員權限)。

PHP 呼叫端程式碼

<?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)

常見問題排查

  • Class not registered:regsvr32 失敗、32/64 位元不匹配 (PHP 32bit 需 32bit DLL、在 64bit OS 用 %windir%\SysWOW64\regsvr32.exe)。
  • DISP_E_EXCEPTION:VB 端執行錯誤,檢查事件檢視器、加入 VB 錯誤處理 On Error Goto ErrHandler。
  • 權限不足:IIS/IUSR 帳號需有 DLL 讀取/執行權限、註冊表 HKCR\CLSID\{...} 讀取權限。

現代替代方案

  1. .NET Interop:將 VB6 遷移至 VB.NET/C# Class Library,PHP 透過 COM 或 dotnet 擴展呼叫 (需 php_dotnet.dll),或改用 REST/gRPC 微服務化。
  2. PHP 原生實作:重寫商務邏輯於 PHP,消除跨語言複雜度。
  3. Windows 系統功能:改用 exec() 呼叫 PowerShell/CMD、proc_open()、ffi 擴展 (PHP 7.4+) 直接呼叫 C DLL。

結語

PHP-COM-VB6 互操作是企業級系統整合舊資產的經典方案,展示了 COM 二進位介面標準的跨語言威力。隨著 VB6 終止支援、PHP 現代化、微服務架構普及,新專案應避免此架構,既有系統應規劃遷移路徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved