64位系統VBS調用32位COM組件


64位系統VBS調用32位COM組件

標簽: 32位64位COMCOM組件VBVBSVBScript

今天有人問我,為什么他的VBS腳本在64位Windows 7中用VbsEdit可以直接執行,但是直接雙擊就會出錯:ActiveX 部件不能創建對象: ‘MSWinsock.Winsock’。

 

在64位系統中存在兩組不同的wscript.exe和cscript.exe,一組是64位的,在C:\Windows\System32文件夾;一組是32位的,在C:\Windows\SysWOW64文件夾。由於64位和32位的內存模式不同,64位進程無法加載32位DLL,故以DLL封裝COM組件無法在64位進程調用。

具體到上面的問題,MSWinsock.Winsock是32位COM組件,而直接雙擊運行VBS文件默認是以C:\Windows\System32\wscript.exe為宿主的,也就是64位的進程,64位進程無法加載32位的DLL,所以會出現“ActiveX 部件不能創建對象”的錯誤。如果想不報錯的話需要手動指定用32位的宿主來執行。

那為什么用VbsEdit可以直接執行呢?因為早期版本的VbsEdit在64位系統上會自動調用32位的wscript.exe或者cscript.exe來執行腳本。對於比較新的VbsEdit,已經區分為32位的VbsEdit何64位的VbsEdit,不同版本的VbsEdit會調用對應版本的wscript.exe或者cscript.exe來執行。

怎樣才能在64位系統里直接雙擊運行包含32位COM組件調用的VBS腳本呢?一種方法是改注冊表,但是這個方法不通用;另一種方法是在VBS代碼中做檢測:

Option Explicit

Run32()

Dim Winsock
Set Winsock = CreateObject("MSWinsock.Winsock")
MsgBox "成功創建MSWinsock.Winsock對象"

Sub Run32()
    'Author: Demon
    'Date: 2015/7/9
    'Website: http://demon.tw

    Dim strComputer, objWMIService, colItems, objItem, strSystemType
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem",,48)
    
    For Each objItem in colItems
        strSystemType = objItem.SystemType
    Next
    
    If InStr(strSystemType, "x64") > 0 Then
        Dim fso, WshShell, strFullName
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set WshShell = CreateObject("WScript.Shell")
        strFullName = WScript.FullName
        If InStr(1, strFullName, "system32", 1) > 0 Then
            strFullName = Replace(strFullName, "system32", "SysWOW64", 1, 1, 1)
            WshShell.Run strFullName & " " &_
                """" & WScript.ScriptFullName & """", 10, False
            WScript.Quit
        End If
    End If
End Sub

參考鏈接:https://msdn.microsoft.com/en-us/library/windows/desktop/aa384231(v=vs.85).aspx

隨機文章:

  1. PowerISO 5.7 注冊碼
  2. 桌面上出現無法刪除圖標的解決方法
  3. PHP:小心urldecode引發的SQL注入漏洞
  4. sha1sum for windows
  5. Msxml2.XMLHTTP和Msxml2.ServerXMLHTTP的區別

7 條評論 發表在“64位系統VBS調用32位COM組件”上

  1. […] « 64位系統VBS調用32位COM組件 […]

  2. leejoa 說道:

    所噶,大哥您是CrLf,還是pcl_test??

  3. 雨中風鈴 說道:

    原理很簡單,但一直沒有人去普及這樣的知識,很多vbs代碼轉到64位平台后都會報錯,很多人也不知道怎么處理,比如連接access數據庫的代碼

  4. 老伙計 說道:

    此代碼在 Win7 x64 專業版環境下無效!

  5. 熾添火 說道:

    非常感謝,按照您的方法已經順利可以雙擊運行vbs了,之前都是報不能創建Activex的錯,困擾好久的問題終於解決了,但是還是遇到另外個問題就是VBS調用組件里的窗體時 ,窗體閃一下就沒了,不知道時什么原因


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM