如何在 vbscript 中从自定义 .net dll 调用方法

How call method from custom .net dll in vbscript

我可以管理dll。此 dll 包含 return 自定义结构等方法。

方法与结构

    [DllImport("powrprof.dll")]
            private static extern uint CallNtPowerInformation(
                int InformationLevel,
                IntPtr lpInputBuffer,
                int nInputBufferSize,
                ref SystemPowerInformation spi,
                int nOutputBufferSize
            );

public SystemPowerInformation GetSystemPowerInformation()
        {
            SystemPowerInformation spi = new SystemPowerInformation();

            CallNtPowerInformation(12,
                IntPtr.Zero,
                0,
                ref spi,
                Marshal.SizeOf(spi));

            return spi;
        }

[ComVisible(true)]
    [StructLayout(LayoutKind.Sequential)]
    [Guid("A79B0F9F-00C7-46C8-A3AE-D371E09ADB0C")]
    public struct SystemPowerInformation
    {
        public uint MaxIdlenessAllowed;
        public uint Idleness;
        public uint TimeRemaining;
        public byte CoolingMode;
    }

VbScript

set calc = CreateObject("PowerStateManagement.PowerStateManagement")

sleepTime = calc.GetLastSleepTime()
WScript.Echo(sleepTime)

wakeTime = calc.GetLastWakeTime()
WScript.Echo(wakeTime)

spi = calc.GetSystemPowerInformation()

WScript.Echo(spi.TimeRemaining)

我 运行 这个脚本时出现异常。

0x800a01a8 - Microsoft VBScript runtime error: Object required: 'spi'

但是如果 GetSystemPowerInformation 方法重写为 return spi.TimeRemaining 那么这个脚本 return 正确的 TimeRemaining

为什么我不能 return 结构,只有结构的字段?

VBScript只支持Variant类型,Variant类型不支持结构体。给spi赋值后,VarType(spi)的结果是什么?如果它是字节数组,您可以获取表示 TimeRemaining 值的 4 个字节并尝试将它们转换为 uint。