VB.NET - Проблемы с SHQueryRecycleBin - PullRequest
0 голосов
/ 12 июля 2011

В настоящее время я работаю над приложением для личного пользования. Идея состоит в том, что вы можете открыть его и получить все виды статистики вашего компьютера (Корзина, Диски, Сеть и многое другое). Теперь я работал с SHQueryRecycleBin из Win API.

Хотя у меня есть некоторые проблемы. И я попытался найти устаревшие решения для решений VB6 или VB.NET, которые просто не работали. Я использовал ссылку на код из этого источника и для получения размера и количества файлов, которые я использовал этого источника .

Я поместил его в таймер, и после того, как эти 100 тиков (как я их установил) были запущены, я получил эту ошибку:

File I/O of a structure with field 'cbSize' of type 'UInt32' is not valid.

Тип cbSize - это UInteger, который (очевидно) автоматически изменяется на UInt32 - я думаю, что он основан на системе.

Вы должны заметить, что я на Windows 7 x86 (64-разрядная версия). Если у вас есть решение для этого или другого фрагмента кода, которое проще, чем использовать Win API, сообщите мне.

Я посмотрел на System.Management, но хотел пуленепробиваемый код, который мог бы взаимодействовать с большинством систем.

1 Ответ

1 голос
/ 12 июля 2011

У меня нет vb.net, пригодного для тестирования, но следующий код прекрасно работает в vb6:

В модуле:

Public Type SHRECYCLEBININFO
  cbSize As Long
  i64Size As Currency
  i64NumItems As Currency
End Type
Public Declare Function SHQueryRecycleBin Lib "shell32.dll" Alias "SHQueryRecycleBinA" (ByVal pszRootPath As String, pSHQueryRBInfo As SHRECYCLEBININFO) As Long

И в форме:

Private Sub Command1_Click()
    Dim info As SHRECYCLEBININFO
    Dim res As Long

    info.cbSize = Len(info)
    res = SHQueryRecycleBin("C:\", info)
    MsgBox "size: " & (info.i64Size * 10000) & " bytes" & vbCrLf & "items: " & (info.i64NumItems * 10000)
End Sub

Обратите внимание на использование типа «валюта» - это потому, что vb6 не имеет нормального типа данных для 64-битных целых чисел.Тип Currency использует 8 байтов, но сохраняет 4 десятичных знака, следовательно, умножение на 10000 для получения результатов.

...