【问题标题】:(SOLVED) Visual Basic - 'GetObject' Not Declared(已解决)Visual Basic - 未声明“GetObject”
【发布时间】:2021-04-23 16:43:34
【问题描述】:

我在尝试将脚本从 VBScript 更新到标准 VB 时遇到了问题。该脚本仅检查 Excel 的任何正在运行的进程,然后确定它们运行了多长时间,如果该时间超过 4 分钟,则将其关闭。 这是脚本:

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。我在 Visual Studio 中编码,它给了我错误 BC30451(未声明“GetObject”)。我理解错误的含义,但我的问题是,为什么 GetObject 不存在?不是 Visual Basic 的内置函数吗?

我尝试将 GetObject 切换为 CreateObject,但我觉得将其更改为 CreateObject 并不能解决我的问题。另外,当我这样做时,我得到了“无法创建 ActiveX 组件”错误,所以这是另一个死胡同。

我是否遗漏了诸如对图书馆的引用之类的东西或类似的想法?我的语法有点不对劲吗?我试图阅读文档,但除了使用 GetObject 之前的 Set 语句之外,文档和我的代码之间似乎没有什么不同。但是 Visual Studio 告诉我 Let 和 Set 无论如何都已经过时了。

感谢任何可以帮助我解决这个问题的人

【问题讨论】:

  • 查看示例here,使用System.Management。顺便说一句,要转换日期,您可以使用 ManagementDateTimeConverter 类。
  • 使用WMI Code Creator utility,它会自动编写你需要的vb.net代码。
  • 使用您建议 Hans 的 WMI Code Creator 实用程序,我已经开始让事情重新开始了。谢谢你的建议。我现在遇到另一个问题,我要导入的命名空间(systems.management 等)遇到 BC40056 错误(无法找到导入中指定的命名空间或类型)。如果这些导入正常工作,我需要的一些变量类型就没有定义。我在谷歌上四处寻找发生了什么。有什么建议吗?
  • 您是否引用了声明这些类型的程序集?如果没有引用包含成员类型声明的程序集,则无法导入命名空间。如果不能访问作为特定命名空间成员的至少一种类型,则该命名空间不存在。
  • 代码能编译吗?听起来您可能创建了一个 .net 核心控制台项目 - 您想创建一个控制台应用程序(.NET 框架)。如果 createobject 正在编译,并且创建对象失败?那么这是一个不同的问题。至少就能够编译而言,您所拥有的看起来不错。

标签: vb.net


【解决方案1】:

在 cmets 中做了很多贡献并在文档中进行了更多搜索之后,我终于能够想出一个解决方案。该程序完全按预期工作。我将在下面发布代码,以防其他人需要它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多