Страница: 1 |
|
Вопрос: Проблема с использованием WinApi функции
|
Добавлено: 05.06.11 17:47
|
|
Автор вопроса: Wlad | ICQ: 6977577
|
Public Class Form1
Declare Auto Function GetFileInfo Lib "kernel32.dll" Alias "GetFileInformationByHandle" (
ByVal hwnd As Integer) As some
Public Structure some
Dim dwFileAttributes As Integer
Dim ftCreationTime As Filetime1
Dim ftLastAccessTime As Filetime2
Dim ftLastWriteTime As Filetime3
Dim dwVolumeSerialNumber As Integer
Dim nFileSizeHigh As Integer
Dim nFileSizeLow As Integer
Dim nNumberOfLinks As Integer
Dim nFileIndexHigh As Integer
Dim nFileIndexLow As Integer
End Structure
Public Structure Filetime1
Dim dwLowDateTime As Integer
Dim dwHighDateTime As Integer
End Structure
Public Structure Filetime2
Dim dwLowDateTime As Integer
Dim dwHighDateTime As Integer
End Structure
Public Structure Filetime3
Dim dwLowDateTime As Integer
Dim dwHighDateTime As Integer
End Structure
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim f As New some
Dim hwnd As Integer
hwnd = &H2A4 // Дескриптор файла для доступа
f = GetFileInfo(hwnd) // Собственно,доступ получаем : )
MsgBox(любое поле структуры) // Для проверки работоспособности
End Sub
End Class
Возвращает постоянно 0,а почему - непонятно.Судя по ошибке,дело в передаваемых параметрах,но так как я новичек,то проблему найти не могу.Может,это сможете сделать вы...
Также встаёт вопрос - как извратиться,чтобы в мсгбоксе любой тип данных выводился,если это возможно ?
Используемая среда: Visual Studio
Ответить
|
Номер ответа: 1 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #1
|
Добавлено: 05.06.11 19:57
|
GetFileInfo объявлена не верно, структура Filetime зачем-то продублирована несколько раз, хендл файла почему-то константа и вообще, зачем API, есть System.IO.FileInfo.
- Public Structure FILETIME
- Dim dwLowDateTime As Integer
- Dim dwHighDateTime As Integer
- End Structure
-
- Public Structure BY_HANDLE_FILE_INFORMATION
- Dim dwFileAttributes As Integer
- Dim ftCreationTime As FILETIME
- Dim ftLastAccessTime As FILETIME
- Dim ftLastWriteTime As FILETIME
- Dim dwVolumeSerialNumber As Integer
- Dim nFileSizeHigh As Integer
- Dim nFileSizeLow As Integer
- Dim nNumberOfLinks As Integer
- Dim nFileIndexHigh As Integer
- Dim nFileIndexLow As Integer
- End Structure
-
-
- Declare Auto Function CreateFile Lib "kernel32.dll" (ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As Integer, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As Integer) As Integer
- Declare Auto Function GetFileInfo Lib "kernel32.dll" Alias "GetFileInformationByHandle" (ByVal handle As Integer, ByRef sm As BY_HANDLE_FILE_INFORMATION) As Integer
-
-
-
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Dim pathstr As String = "D:\note.txt"
-
- Dim hfile = CreateFile(pathstr, 0, 0, 0, &H3, 0, 0)
- Dim hfinfo As BY_HANDLE_FILE_INFORMATION
- GetFileInfo(hfile, hfinfo)
- Dim sz1 = (&H10000 * hfinfo.nFileSizeHigh + hfinfo.nFileSizeLow)
-
- Dim sz2 = New System.IO.FileInfo(pathstr).Length
- MsgBox(pathstr & " API : " & sz1 & ", System.IO : " & sz2 & " bytes")
- End Sub
Ответить
|
Номер ответа: 5 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #5
|
Добавлено: 05.06.11 22:06
|
По поводу объявления структур - называй как хочешь, у тебя это просто ошибка стилистики, что классические веши в WIN32API обзываешь по своему. Но грубейшая ошибка ожидать что апи-функции возврашают структуры. Все они (за редчайшим исключением) возврашают 32-битное целое.
Dim hfile as Integer,sz1 as Integer... это уже я ошибся, пока набирал.
Ответить
|
Номер ответа: 7 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #7
|
Добавлено: 05.06.11 22:35
|
У меня она объявлена (декларирована) as Integer.
И ее вызов GetFileInfo(hfile, hfinfo) возвращает, разумеется, Integer.
dim somevar as Object = 666 'курим.
Ответить
|
Номер ответа: 9 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #9
|
Добавлено: 07.06.11 00:09
|
- Хендл обычно объявляется как IntPtr, это структура
Но правда очень своеобразная, с одним полем, которое даже не используется.
DECLARE_HANDLE(name) struct name##__{int unused;};typedef struct name##__ *name
Что в переводе означает, что хендл есть указатель на структуру, и будь у нее хоть 20 полей, размер указателя от этого не изменится.
Так, мысли вслух.
Ответить
|
Номер ответа: 11 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #11
|
Добавлено: 08.06.11 12:44
|
Ну, конечно, все это схоластика, но какова суть хендла. Что означает само число, представленное им?
Ресурс, указатель-на-указатель структуры в "неуправляемой" памяти. И когда я говорил о своеобразности, я имел ввиду не структуру IntPtr.
Ответить
|
Страница: 1 |
Поиск по форуму