0

我会使用 Open Hardware Monitor 库来读取有关硬件的一些值,而不是执行 OpenHardwareMonitor.exe 并从 WMI 中读取,因此我使用 RegAsm 在注册表中注册类型(因此我可以将库中的类作为 COM 对象运行)。首先,我将项目的 COMVISIBLE 属性更改为 TRUE,并使用 MSBuild.exe 重新编译了库。我会将此脚本转换为 Autoit,但是当我尝试调用任何方法时,我收到错误:“无效指针”。或“例外:对象引用未设置为对象的实例”。我不明白为什么会出现该错误,我认为这不是 RegAsm 的原因,因为它给了我一个警告,但随后它完成了注册类型的工作,这就是它添加到注册表中的内容:

REGEDIT4

[HKEY_CLASSES_ROOT\Record\{1FD2DBF2-D8C3-3E57-B448-37196EB12D9C}\0.6.0.11]
"Class"="OpenHardwareMonitor.Hardware.ControlMode"
"Assembly"="OpenHardwareMonitorLib, Version=0.6.0.11, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/Users/gianluca/Desktop/lavoro/openhardwaremonitorlib.dll"

[HKEY_CLASSES_ROOT\OpenHardwareMonitor.Hardware.Computer]
@="OpenHardwareMonitor.Hardware.Computer"

[HKEY_CLASSES_ROOT\OpenHardwareMonitor.Hardware.Computer\CLSID]
@="{5E652471-D269-3567-BB38-DCEBFF5669CF}"

[HKEY_CLASSES_ROOT\CLSID\{5E652471-D269-3567-BB38-DCEBFF5669CF}]
@="OpenHardwareMonitor.Hardware.Computer"

[HKEY_CLASSES_ROOT\CLSID\{5E652471-D269-3567-BB38-DCEBFF5669CF}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="OpenHardwareMonitor.Hardware.Computer"
"Assembly"="OpenHardwareMonitorLib, Version=0.6.0.11, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/Users/gianluca/Desktop/lavoro/openhardwaremonitorlib.dll"

[HKEY_CLASSES_ROOT\CLSID\{5E652471-D269-3567-BB38-DCEBFF5669CF}\InprocServer32\0.6.0.11]
"Class"="OpenHardwareMonitor.Hardware.Computer"
"Assembly"="OpenHardwareMonitorLib, Version=0.6.0.11, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/Users/gianluca/Desktop/lavoro/openhardwaremonitorlib.dll"

[HKEY_CLASSES_ROOT\CLSID\{5E652471-D269-3567-BB38-DCEBFF5669CF}\ProgId]
@="OpenHardwareMonitor.Hardware.Computer"

[HKEY_CLASSES_ROOT\CLSID\{5E652471-D269-3567-BB38-DCEBFF5669CF}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

[HKEY_CLASSES_ROOT\Record\{E4E64F96-C708-381E-8380-93DF59B324B0}\0.6.0.11]
"Class"="OpenHardwareMonitor.Hardware.HardwareType"
"Assembly"="OpenHardwareMonitorLib, Version=0.6.0.11, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/Users/gianluca/Desktop/lavoro/openhardwaremonitorlib.dll"

[HKEY_CLASSES_ROOT\Record\{DFC56287-93E1-3B82-8F95-5F4268CB0401}\0.6.0.11]
"Class"="OpenHardwareMonitor.Hardware.SensorType"
"Assembly"="OpenHardwareMonitorLib, Version=0.6.0.11, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/Users/gianluca/Desktop/lavoro/openhardwaremonitorlib.dll"

[HKEY_CLASSES_ROOT\Record\{6042D116-95C1-3C8A-B8DC-D0E6C8F5BA07}\0.6.0.11]
"Class"="OpenHardwareMonitor.Hardware.SensorValue"
"Assembly"="OpenHardwareMonitorLib, Version=0.6.0.11, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/Users/gianluca/Desktop/lavoro/openhardwaremonitorlib.dll"

这是 OLEView 显示的内容:http://i.stack.imgur.com/Oa1NO.jpg 是生成错误的简单脚本:

#RequireAdmin
$RegAsm_path = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm" ; CHECK YOUR VERSION!!!
$foo = Run($RegAsm_path & " /codebase /nologo OpenHardwareMonitorlib.dll", "", @SW_HIDE, 0x2 + 0x4)
$std = _Read_Std($foo)
MsgBox(0,$foo,$std)

$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")

$cp = ObjCreate("OpenHardwareMonitor.Hardware.Computer")
If IsObj($cp) Then MsgBox(0,"OpenHardwareMonitor.Hardware.Computer","Object created")
$cp.Open() ; <--------------- ERROR

RunWait($RegAsm_path & " /nologo /unregister OpenHardwareMonitorlib.dll", "", @SW_HIDE)

Func MyErrFunc()
    $HexNumber=hex($oMyError.number,8)
    Msgbox(0,"","We intercepted a COM Error !" & @CRLF & _
        "Number is: " & $HexNumber & @CRLF & _
        "Windescription is: " & $oMyError.windescription & @CRLF & _
        "Source is: " & $oMyError.source & @CRLF & _
        "Description is: " & $oMyError.description & @CRLF & _
        "Script line is: " & $oMyError.scriptline)
    RunWait($RegAsm_path & " /nologo /unregister OpenHardwareMonitorlib.dll", "", @SW_HIDE)
    Exit
Endfunc

Func _Read_Std($handle)
    Local $s
    While 1
        $s &= StdoutRead($handle)
        If @error Then ExitLoop
        $s &= StderrRead($handle)
        If @error Then ExitLoop
    WEnd
    Return $s
EndFunc

首先执行脚本,您需要在第 2 行检查您的 .NET Framework 版本。 是一个包含脚本和库的存档

4

1 回答 1

0

您是否尝试将 #AutoIt3Wrapper_UseX64=N 添加到脚本中以将其作为 32 位 COM 对象运行

于 2014-07-23T08:04:57.920 回答