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

时间:2016-08-17 22:19:52

标签: c# dll vbscript com interop

我可以管理dll。这个dll包含返回自定义结构的方法。

方法和结构

    [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运行时错误:所需对象:'spi'

但如果 GetSystemPowerInformation 方法重写为return spi.TimeRemaining,则此脚本会返回正确的 TimeRemaining

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

1 个答案:

答案 0 :(得分:1)

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