EnumPwrSchemes - err.458

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

EnumPwrSchemes - err.458

Сообщение NIC » 02.04.2008 (Ср) 20:30

С MSDN,сделал код для использования в VB6.
Возникает ошибка 458,а иногда 48.
Все типы данных вроде без ошибок.
Что в этом коде я сделал неправильно?

Заранее благодарен.

Код: Выделить всё
Option Explicit

Public Enum POWER_ACTION
    PowerActionNone = 0
    PowerActionReserved
    PowerActionSleep
    PowerActionHibernate
    PowerActionShutdown
    PowerActionShutdownReset
    PowerActionShutdownOff
    PowerActionWarmEject
End Enum

Public Enum SYSTEM_POWER_STATE
    PowerSystemUnspecified = 0
    PowerSystemWorking = 1
    PowerSystemSleeping1 = 2
    PowerSystemSleeping2 = 3
    PowerSystemSleeping3 = 4
    PowerSystemHibernate = 5
    PowerSystemShutdown = 6
    PowerSystemMaximum = 7
End Enum
Public Type POWER_ACTION_POLICY
    Action As POWER_ACTION
    Flags As Long
    EventCode As Long
End Type

Public Type USER_POWER_POLICY
     Revision As Long
     IdleAc As POWER_ACTION_POLICY
     IdleDc As POWER_ACTION_POLICY
     IdleTimeoutAc As Long
     IdleTimeoutDc As Long
     IdleSensitivityAc As Byte
     IdleSensitivityDc As Byte
     ThrottlePolicyAc As Byte
     ThrottlePolicyDc As Byte
     MaxSleepAc As SYSTEM_POWER_STATE
     MaxSleepDc As SYSTEM_POWER_STATE
     Reserved As Long
     VideoTimeoutAc As Long
     VideoTimeoutDc As Long
     SpindownTimeoutAc As Long
     SpindownTimeoutDc As Long
     OptimizeForPowerAc As Boolean
     OptimizeForPowerDc As Boolean
     FanThrottleToleranceAc As Byte
     FanThrottleToleranceDc As Byte
     ForcedThrottleAc As Byte
     ForcedThrottleDc As Byte
End Type

Public Type MACHINE_POWER_POLICY
     Revision As Byte
     MinSleepAc As SYSTEM_POWER_STATE
     MinSleepDc As SYSTEM_POWER_STATE
     ReducedLatencySleepAc As SYSTEM_POWER_STATE
     ReducedLatencySleepDc As SYSTEM_POWER_STATE
     DozeTimeoutAc As Long
     DozeTimeoutDc As Long
     DozeS4TimeoutAc As Long
     DozeS4TimeoutDc As Long
     MinThrottleAc As Byte
     MinThrottleDc As Byte
     pad1 As Byte
     OverThrottledAc As POWER_ACTION_POLICY
     OverThrottledDc As POWER_ACTION_POLICY
End Type

Public Type POWER_POLICY
     user As USER_POWER_POLICY
     machine As MACHINE_POWER_POLICY
End Type

Declare Function EnumPwrSchemes Lib "PowrProf.dll" (ByVal lpfnPwrSchemesEnumProc As Long, ByVal lParam As Long) As Boolean

Dim sName As String * 256
Dim sDesc As String * 256

Public Function PwrSchemesEnumProcFunction(ByVal uiIndex As Long, ByVal dwName As Long, ByRef sName, ByVal dwDesc As Long, ByRef sDesc, ByRef pp As POWER_POLICY, ByVal lParam As Long) As Boolean
PwrSchemesEnumProcFunction = False

'......

End Function
   
Sub Main()
sName = String(255, vbNullChar)
sDesc = String(255, vbNullChar)
Dim ret As Boolean
ret = EnumPwrSchemes(AddressOf PwrSchemesEnumProcFunction, 0)
End Sub

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.04.2008 (Чт) 7:57

Как минимум заменить в объявлениях Boolean на Long (хотя это по и дее не должно оказывать влияния). Ну и сишный BOOLEAN <> Byte, ЕМНИП BOOLEAN имеет размер 2 байта.
З.Ы. На какие строки ругается?
Весь мир матрица, а мы в нем потоки байтов!

NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

Сообщение NIC » 03.04.2008 (Чт) 10:04

Там где Byte,в сишных строках обозначено-UCHAR-байт символа без знака.Хотя на мой взгляд довольно странно представлять Char со знаком. :D
А ошибка возникает "runtime",строки не выделяет.

Попробую всe Boolean,на Long сменить. :roll:

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.04.2008 (Чт) 12:11

NIC писал(а):А ошибка возникает "runtime",строки не выделяет.

А под IDE?
Насчет Byte погорячился. В тех сишных прототипах структур используется в одном месте BOOLEAN, в другом UCHAR, оба эти типа имеют размер 8 бит, то есть равны Byte.
Весь мир матрица, а мы в нем потоки байтов!

NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

Сообщение NIC » 03.04.2008 (Чт) 12:38

Дык,ошибка 458 это неподдержка автоматизации а 48 это отсутствие файла powrprof.dll,причём после запуска даже под IDE,видимо возникает сбой или переполнение или прочее (точно незнаю) и результат - нарушение работы винды. Ни одна программа которая использует powrprof уже не работает.Те которые писаны под framework -сообщают об остсутсвии этой библиотеки.

Помогает перезагрузка.
Ещё раз проверю все типы...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.04.2008 (Чт) 15:05

Библиотека сия присутствует в системе по крайней мере, начиная от Windows 2000 и до Windows XP. А ошибки соответственно такие:
48 Error in loading DLL
458 Variable uses an Automation type not supported in Visual Basic
ИМХО, странные какие то ошибки в данном контексте

ADD:
Вот еще два странных момента:
Dim sName As String * 256
Dim sDesc As String * 256

и

sName = String(255, vbNullChar)
sDesc = String(255, vbNullChar)
Весь мир матрица, а мы в нем потоки байтов!

NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

Сообщение NIC » 03.04.2008 (Чт) 15:44

Проблемы с библиотекой начинаються с момента первого запуска этого кода.Видимо в системе что-то нарушаеться. :roll:

string - можно убрать
dim тоже если по ByVal использовать
Я сначала по ByRef пробовал,а потом строки забыл стереть.

На VB.NET всё работает с этими структурами.А здесь...

NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

Сообщение NIC » 04.04.2008 (Пт) 7:54

Вот как выглядит определение в MSDN.

MSDN писал(а):typedef struct _USER_POWER_POLICY {

//....
ULONG Reserved[2];

} USER_POWER_POLICY, *PUSER_POWER_POLICY;


Какой тип имеет Reserved[2]?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 04.04.2008 (Пт) 10:56

Reserved(1) as Long, если я ничего не путаю
label:
cli
jmp label

NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

Сообщение NIC » 04.04.2008 (Пт) 12:05

iGrok
я уж "вкурил" что это массив и попробовал.
Ничего ни изменилось. :(

В C,массивы нумеруються с 0.
Предположу,что правильно,все же писать Reserved(2) as Long

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 04.04.2008 (Пт) 12:51

Вообще на Reverved можно забивать. Главное, чтобы в этом месте в объявляемом типе стояло *что-то* занимающее ровно столько же места.

Нумерация массивов в C с нуля, а вот при объявлении по-моему указывается не как в бейсике, верхняя граница, а кол-во элементов. Но тут уж действительно могу ошибаться, ибо с C работал очень немного.
label:
cli
jmp label

NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

Сообщение NIC » 04.04.2008 (Пт) 13:42

Я вот тоже подумал о том же.(кол-во элементов)
Пробовал и (1) и (2) и по-разному.Результат неизменен.

В VB.NET этот элемент "обзываеться" так
Код: Выделить всё
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Public Reserved As UInteger()

...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.04.2008 (Пт) 14:09

NIC, в сях индексация массивов с 0, однако при определении массива указывается количество элементов, посему в VB будет так:
Код: Выделить всё
Type USER_POWER_POLICY 
'....
Reserved(1) As Long
End Type

или даже так
Код: Выделить всё
Type USER_POWER_POLICY 
'....
Reserved(0 To 1) As Long
End Type
Весь мир матрица, а мы в нем потоки байтов!

NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

Сообщение NIC » 04.04.2008 (Пт) 14:17

Может VB на такое не способен? :D :D :D

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.04.2008 (Пт) 14:34

VB способен практически на все. На это точно должен быть способен
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65

    TopList