Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Ким Чен Ир



Вопросов: 0
Ответов: 140
 Профиль | | #1 Добавлено: 05.06.11 19:57
GetFileInfo объявлена не верно, структура Filetime зачем-то продублирована несколько раз, хендл файла почему-то константа и вообще, зачем API, есть System.IO.FileInfo.

  1. Public Structure FILETIME
  2.         Dim dwLowDateTime As Integer
  3.         Dim dwHighDateTime As Integer
  4.     End Structure
  5.  
  6.     Public Structure BY_HANDLE_FILE_INFORMATION
  7.         Dim dwFileAttributes As Integer
  8.         Dim ftCreationTime As FILETIME
  9.         Dim ftLastAccessTime As FILETIME
  10.         Dim ftLastWriteTime As FILETIME
  11.         Dim dwVolumeSerialNumber As Integer
  12.         Dim nFileSizeHigh As Integer
  13.         Dim nFileSizeLow As Integer
  14.         Dim nNumberOfLinks As Integer
  15.         Dim nFileIndexHigh As Integer
  16.         Dim nFileIndexLow As Integer
  17.     End Structure
  18.  
  19.  
  20.     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
  21.     Declare Auto Function GetFileInfo Lib "kernel32.dll" Alias "GetFileInformationByHandle" (ByVal handle As Integer, ByRef sm As BY_HANDLE_FILE_INFORMATION) As Integer
  22.  
  23.  
  24.  
  25.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  26.         Dim pathstr As String = "D:\note.txt"
  27.         '
  28.         Dim hfile = CreateFile(pathstr, 0, 0, 0, &H3, 0, 0) '//OPEN_EXISTING
  29.         Dim hfinfo As BY_HANDLE_FILE_INFORMATION
  30.         GetFileInfo(hfile, hfinfo)
  31.         Dim sz1 = (&H10000 * hfinfo.nFileSizeHigh + hfinfo.nFileSizeLow)
  32.         '
  33.         Dim sz2 = New System.IO.FileInfo(pathstr).Length
  34.         MsgBox(pathstr & " API : " & sz1 & ", System.IO : " & sz2 & " bytes")
  35.     End Sub

Ответить

Номер ответа: 2
Автор ответа:
 Wlad



ICQ: 6977577 

Вопросов: 3
Ответов: 9
 Профиль | | #2 Добавлено: 05.06.11 21:06
Спасибочки...будем курить:)

Ответить

Номер ответа: 3
Автор ответа:
 Wlad



ICQ: 6977577 

Вопросов: 3
Ответов: 9
 Профиль | | #3 Добавлено: 05.06.11 21:15
Да,со структурами я явно переборщил - мне почему-то показалось,что в них содержатся разные данные ))))(увидел ошибку),а по поводу хендла - разве он не как Integer объявляется(число ведь)? ( В DEV-CPP выходило как HWND hwnd ),или я опять что-то проглядел ? :(

Ответить

Номер ответа: 4
Автор ответа:
 Wlad



ICQ: 6977577 

Вопросов: 3
Ответов: 9
 Профиль | | #4 Добавлено: 05.06.11 21:19
По поводу объявления структур - думал,что её можно обозвать по собственному выбору,а потом просто передать её и всё...Выходит,что нельзя:(

Ответить

Номер ответа: 5
Автор ответа:
 Ким Чен Ир



Вопросов: 0
Ответов: 140
 Профиль | | #5 Добавлено: 05.06.11 22:06
По поводу объявления структур
- называй как хочешь, у тебя это просто ошибка стилистики, что классические веши в WIN32API обзываешь по своему. Но грубейшая ошибка ожидать что апи-функции возврашают структуры. Все они (за редчайшим исключением) возврашают 32-битное целое.
Dim hfile as Integer,sz1 as Integer... это уже я ошибся, пока набирал.

Ответить

Номер ответа: 6
Автор ответа:
 Wlad



ICQ: 6977577 

Вопросов: 3
Ответов: 9
 Профиль | | #6 Добавлено: 05.06.11 22:15
Теперь вижу...Она BOOL возвращала(.А почему ошибки не было,если ты прописал её как GetFileInfo(hfile, hfinfo),но она же не void...

Ответить

Номер ответа: 7
Автор ответа:
 Ким Чен Ир



Вопросов: 0
Ответов: 140
 Профиль | | #7 Добавлено: 05.06.11 22:35
У меня она объявлена (декларирована) as Integer.
И ее вызов GetFileInfo(hfile, hfinfo) возвращает, разумеется, Integer.
dim somevar as Object = 666 'курим.

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 06.06.11 05:50
Wlad пишет:
а по поводу хендла - разве он не как Integer объявляется(число ведь)?

Хендл обычно объявляется как IntPtr, это структура, которая имеет размер 4 или 8 байт в зависимости от архитектуры приложения (32-битное или 64-битное).

Ответить

Номер ответа: 9
Автор ответа:
 Ким Чен Ир



Вопросов: 0
Ответов: 140
 Профиль | | #9 Добавлено: 07.06.11 00:09
  1. Хендл обычно объявляется как IntPtr, это структура

Но правда очень своеобразная, с одним полем, которое даже не используется.
DECLARE_HANDLE(name) struct name##__{int unused;};typedef struct name##__ *name
Что в переводе означает, что хендл есть указатель на структуру, и будь у нее хоть 20 полей, размер указателя от этого не изменится.
Так, мысли вслух.

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 08.06.11 11:58
Не понимаю что тут своеобразного? В исходниках IntPtr это хорошо видно.
  1.         public static int Size
  2.         {
  3.             [Pure]
  4.             [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  5. #if !FEATURE_CORECLR
  6.             [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
  7. #endif
  8.             get
  9.             {
  10.                 #if WIN32
  11.                     return 4;
  12.                 #else
  13.                     return 8;
  14.                 #endif
  15.             }
  16.         }


Документация также это подтверждает
  1. The IntPtr type is designed to be an integer whose size is platform-specific. That is, an instance of this type is expected to be 32-bits on 32-bit hardware and operating systems, and 64-bits on 64-bit hardware and operating systems.

Ответить

Номер ответа: 11
Автор ответа:
 Ким Чен Ир



Вопросов: 0
Ответов: 140
 Профиль | | #11 Добавлено: 08.06.11 12:44
Ну, конечно, все это схоластика, но какова суть хендла. Что означает само число, представленное им?
Ресурс, указатель-на-указатель структуры в "неуправляемой" памяти. И когда я говорил о своеобразности, я имел ввиду не структуру IntPtr.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам