Vb.net (已解决)Visual Basic-';GetObject';未申报
我在尝试将脚本从VBScript更新为标准VB时遇到了一个问题。该脚本只需检查Excel的任何正在运行的进程,然后确定它们运行了多长时间,如果时间超过4分钟,则将其关闭。 以下是脚本:Vb.net (已解决)Visual Basic-';GetObject';未申报,vb.net,Vb.net,我在尝试将脚本从VBScript更新为标准VB时遇到了一个问题。该脚本只需检查Excel的任何正在运行的进程,然后确定它们运行了多长时间,如果时间超过4分钟,则将其关闭。 以下是脚本: Imports System Module Program Sub Main() Dim objWMIService As Object, objProcess, colProcess, startDate, timeDiff objWMIService = GetO
Imports System
Module Program
Sub Main()
Dim objWMIService As Object, objProcess, colProcess, startDate, timeDiff
objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
colProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = " & "'EXCEL.EXE'")
For Each objProcess In colProcess
startDate = WMIDateStringToDate(objProcess.creationdate)
timeDiff = DateDiff("n", startDate, Now)
If timeDiff > 4 Then
objProcess.Terminate()
End If
Next
End Sub
Function WMIDateStringToDate(dtmInstallDate As String) As Date
WMIDateStringToDate = CDate(
Mid(dtmInstallDate, 5, 2) & "/" &
Mid(dtmInstallDate, 7, 2) & "/" &
Left(dtmInstallDate, 4) & " " &
Mid(dtmInstallDate, 9, 2) & ":" &
Mid(dtmInstallDate, 11, 2) & ":" &
Mid(dtmInstallDate, 13, 2))
End Function
End Module
总的来说,脚本应该可以工作。然而,有一件事不想工作——调用GetObject。我在VisualStudio中编码,它给了我错误BC30451('GetObject'未声明)。我理解错误的含义,但我的问题是,为什么GetObject不存在?它不是Visual Basic的内置函数吗
我尝试将GetObject切换为CreateObject,但我觉得将其更改为CreateObject无助于解决问题。另外,我在创建ActiveX组件时遇到了“无法创建ActiveX组件”错误,因此这是另一个死胡同
我是不是错过了一些参考图书馆之类的东西?我的语法有点错误吗?我试图阅读文档,但除了使用GetObject之前的Set语句之外,文档和代码之间似乎没有什么不同。但是VisualStudio告诉我Let和Set已经过时了
感谢所有能帮我解决这个问题的人在评论中做了大量的贡献,并对文档进行了更多的搜索之后,我终于找到了一个解决方案。程序完全按照预期工作。我将在下面发布代码,以防其他人需要它:
Imports System
Imports System.Management
Module Program
Sub Main()
Dim objWMIService As New ManagementObjectSearcher(
"root\CIMV2",
"SELECT * FROM Win32_Process WHERE Name = " & "'EXCEL.EXE'"), startDate, timeDiff
For Each queryObj As ManagementObject In objWMIService.Get()
Dim inParams As ManagementBaseObject =
queryObj.GetMethodParameters("Terminate")
startDate = WMIDateStringToDate(queryObj("CreationDate"))
timeDiff = DateDiff("n", startDate, Now)
If timeDiff > 4 Then
queryObj.InvokeMethod("Terminate", inParams, Nothing)
End If
Next
End Sub
Function WMIDateStringToDate(dtmInstallDate As String) As Date
WMIDateStringToDate = CDate(
Mid(dtmInstallDate, 5, 2) & "/" &
Mid(dtmInstallDate, 7, 2) & "/" &
Left(dtmInstallDate, 4) & " " &
Mid(dtmInstallDate, 9, 2) & ":" &
Mid(dtmInstallDate, 11, 2) & ":" &
Mid(dtmInstallDate, 13, 2))
End Function
End Module
请参阅示例,使用
System.Management
。顺便说一句,要转换日期,可以使用该类。使用,它会自动写入所需的vb.net代码。使用Hans建议的WMI代码创建者实用程序,我已经开始让事情再次进展。谢谢你的建议。我现在遇到另一个问题,我要导入的名称空间(systems.management等)遇到BC40056错误(无法找到导入中指定的名称空间或类型)。如果这些导入无法正常工作,则无法定义我需要的某些变量类型。我在谷歌上四处寻找发生了什么。有什么建议吗?您是否引用了在其中声明这些类型的程序集?如果引用的程序集中没有包含成员类型声明的程序集,则无法导入命名空间。如果不访问至少一个作为特定命名空间成员的类型,则该命名空间不存在。代码是否编译?听起来您可能创建了一个.net核心控制台项目-您想创建一个控制台应用程序(.net Framework)。如果createobject正在编译,并且创建对象失败?那就不同了。您所拥有的看起来很好,至少就能够编译而言。