64位系統VBS調用32位COM組件
標簽: 32位, 64位, COM, COM組件, VB, VBS, VBScript
標題: 64位系統VBS調用32位COM組件
作者: Demon
鏈接: http://demon.tw/programming/64bit-vbs-32bit-com.html
版權: 本博客的所有文章,都遵守“署名-非商業性使用-相同方式共享 2.5 中國大陸”協議條款。
今天有人問我,為什么他的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
隨機文章:
[…] « 64位系統VBS調用32位COM組件 […]
我就是在做數據庫是遇到了這個問題 ,現在還是沒有看懂
所噶,大哥您是CrLf,還是pcl_test??
感覺應該都不是
原理很簡單,但一直沒有人去普及這樣的知識,很多vbs代碼轉到64位平台后都會報錯,很多人也不知道怎么處理,比如連接access數據庫的代碼
此代碼在 Win7 x64 專業版環境下無效!
非常感謝,按照您的方法已經順利可以雙擊運行vbs了,之前都是報不能創建Activex的錯,困擾好久的問題終於解決了,但是還是遇到另外個問題就是VBS調用組件里的窗體時 ,窗體閃一下就沒了,不知道時什么原因