首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

64 位 Windows 下 VBS 調用 MSWINSOCK.Winsock 組件失敗的解決之道

     編輯:程式設計疑難解答

問題現場

  • 系統:Win7 64 位;
  • 已將 mswinsck.ocx 放入 C:\Windows\SysWOW64 並用 regsvr32 註冊成功;
  • VBS 腳本調用 WScript.CreateObject("MSWINSOCK.Winsock") 時報錯「ActiveX 元件不能創建對象」。

根本原因

64 位進程無法直接加載 32 位 COM 組件。mswinsck.ocx 是 32 位 ActiveX 控件,註冊在 SysWOW64 實際進入的是 32 位註冊表視圖(HKLM\Software\Wow6432Node\Classes)。預設雙擊運行的 wscript.exe 是 64 位宿主,它讀取 64 位註冊表視圖,找不到該組件的 CLSID,故創建失敗。

解決方案:強制使用 32 位腳本宿主

以管理員身份打開命令提示符,執行:

%windir%\SysWOW64\wscript.exe 你的腳本.vbs

或在腳本開頭添加自檢代碼,自動重啟為 32 位宿主:

If InStr(LCase(WScript.FullName), "syswow64") = 0 Then
    CreateObject("WScript.Shell").Run "%windir%\SysWOW64\wscript.exe " & Chr(34) & WScript.ScriptFullName & Chr(34)
    WScript.Quit
End If

原理解析

  • SysWOW64 目錄下的 wscript.exe 是 32 位版本,能正確讀取 Wow6432Node 註冊表;
  • 同理,若需在 64 位 PowerShell / CMD 中調用 32 位 COM,均需顯式啟動 32 位進程;
  • 長期方案:遷移至 .NET System.Net.Sockets 或 PowerShell System.Net.Sockets.TcpClient,彻底擺脫 32 位 OCX 依賴。

參考資源

Demon's Blog 《64位系統VBS調用32位COM組件》
https://demon.tw/programming/64bit-vbs-32bit-com.html

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