Считывание струкруры IO_COUNTERS

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Считывание струкруры IO_COUNTERS

Сообщение M.A.R.K » 27.02.2008 (Ср) 8:33

Привет всем.
Код: Выделить всё
Private Declare Function GetProcessIoCounters Lib "kernel32.dll" (ByVal hProcess As Long, IoCounters As Any) As Long
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Type IO_COUNTERS
    ReadOperationCount As Long
    WriteOperationCount As Long
    OtherOperationCount As Long
    ReadTransferCount As Long
    WriteTransferCount As Long
    OtherTransferCount As Long
End Type
Dim IO_C As IO_COUNTERS
Private Sub Command1_Click()
Call GetProcessIoCounters(GetCurrentProcess(), ByVal VarPtr(IO_C))
MsgBox (IO_C.ReadOperationCount)
End Sub

MsgBox показывает количество операций считывания у текущего процесса, после чего VB вылетает... :(
Спецы, подскажите что я забыл, что не учел?
Заранее благодарен.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.02.2008 (Ср) 8:57

Во-первых, просто IO_C, без ByVal VarPtr. Либо в декларации укажи ByVal As Long.
Во-вторых, у меня есть подозрение, что ULONGLONG -- это не dword, а qword, используй Currency и умножай на 10000.
И в третьих, если с предыдущими двумя замечаниями я прав, то прекрати злоупотреблять данным разделом.
Lasciate ogni speranza, voi ch'entrate.

M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 27.02.2008 (Ср) 9:36

1) alibek, "...прекрати злоупотреблять данным разделом..." Возможно ты прав... :D
Но у меня есть вопрос про привилегии у процесса, я надеюсь это можно задать в этом разделе?
2) Мой код должен иметь, примерно такой вид:
Код: Выделить всё
Private Declare Function GetProcessIoCounters Lib "kernel32.dll" (ByVal hProcess As Long, IoCounters As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Type IO_COUNTERS
    ReadOperationCount As Long
    WriteOperationCount As Long
    OtherOperationCount As Long
    ReadTransferCount As Long
    WriteTransferCount As Long
    OtherTransferCount As Long
End Type
Dim IO_C As IO_COUNTERS
Private Sub Command1_Click()
Call GetProcessIoCounters(GetCurrentProcess(), byval VarPtr(IO_C))
MsgBox (IO_C.ReadOperationCount)
End Sub

3) Скажи, пожалуйста, что именно и где я должен исправить по твоему 2-рому замечанию "Во-вторых, у меня есть подозрение, что ULONGLONG -- это не dword, а qword, используй Currency и умножай на 10000"

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

Сообщение Viper » 27.02.2008 (Ср) 11:52

Должно быть:
Код: Выделить всё
Private Type IO_COUNTERS
    ReadOperationCount As Currency
    WriteOperationCount As Currency
    OtherOperationCount As Currency
    ReadTransferCount As Currency
    WriteTransferCount As Currency
    OtherTransferCount As Currency
End Type
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.02.2008 (Ср) 14:54

Код: Выделить всё
Private Declare Function GetProcessIoCounters Lib "kernel32.dll" (ByVal hProcess As Long, IoCounters As Any) As Long
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Type IO_COUNTERS
    ReadOperationCount As Currency
    WriteOperationCount As Currency
    OtherOperationCount As Currency
    ReadTransferCount As Currency
    WriteTransferCount As Currency
    OtherTransferCount As Currency
End Type
Dim IO_C As IO_COUNTERS
Private Sub Command1_Click()
Call GetProcessIoCounters(GetCurrentProcess(), IO_C)
MsgBox (IO_C.ReadOperationCount*10000)
End Sub
Lasciate ogni speranza, voi ch'entrate.

M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 28.02.2008 (Чт) 5:40

alibek,Viper, большое спасибо за помощь...
Все работает.


Вернуться в Раздел для Профессионалов

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

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

    TopList