如何在 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。
我可以管理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。