Не Могу Найти В Коде Ошибку!

Тема в разделе "Visual Basic", создана пользователем Vyacheslavovich, 21 ноя 2011.

  1. Vyacheslavovich

    Vyacheslavovich Гость

    На разных платформах при попытке получить версию платформы выдаёт ошибку: Попытка чтения или записи в защищённую память.... Может кто-нить глянет, где ошибка?? И как функция GetVersionEx работает в Windows 7 x64???
    Код (LotusScript):
    Public Class Form1
    Public Structure OSVERSIONINFO
    Dim dwPlatformId As Integer
    End Structure
    Declare Function GetVersionEx Lib "kernel32.dll" Alias "GetVersionExA" (ByVal lpVersionInformation As OSVERSIONINFO) As Integer
    Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim windir As String ' получаем путь папки Windows
    Dim slength As Integer ' получаем длину возвращаемой строки
    windir = Space(255)  ' отводим место для получения строки в буфере
    slength = GetWindowsDirectory(windir, 255) ' узнаем путь папки
    windir = (windir)  ' получаем имя из буфера
    TextBox1.Text = "Корневой каталог: " + windir
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim OS As OSVERSIONINFO
    Dim strName As String = ""
    GetVersionEx(OS)
    Select Case OS.dwPlatformId
    Case 0
    strName = "Windows 32s "
    Case 1
    strName = "Windows 95/98"
    Case 2
    strName = "Windows NT"
    End Select
    TextBox2.Text = "Платформа: " + strName
    End Sub
    End Class
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    а где тут есть вызов ф-ции GetVersionEx? тут только ее декларации приведены.
     
  3. Vyacheslavovich

    Vyacheslavovich Гость

    Да.. извиняюсь, что не написал.. подправил...В общем при попытке получить версию платформы выдаёт ошибку: Попытка чтения или записи в защищённую память...
     
  4. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Размер передаваемой структуры не указан.
    вот пример есть:
    Код (LotusScript):
    Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
    End Type

    Dim OSInfo As OSVERSIONINFO
    'Set the structure size
    OSInfo.dwOSVersionInfoSize = Len(OSInfo)
    'Get the Windows version
    Ret& = GetVersionEx(OSInfo)
    'Chack for errors
    If Ret& = 0 Then MsgBox "Error Getting Version Information": Exit Sub
    'Print the information to the form
    Select Case OSInfo.dwPlatformId
     
  5. Vyacheslavovich

    Vyacheslavovich Гость

    Спасибо .. буду пробывать
     
  6. Vyacheslavovich

    Vyacheslavovich Гость

    Ничего не выходит..
    Постоянно ошибку выдаёт при проверке
    Код (Text):
    Public Structure OSVERSIONINFO
    Dim dwOSVersionInfoSize As Integer 'Размер структуры
    Dim dwMajorVersion As Integer     'Основной номер версии
    Dim dwMinorVersion As Integer     'Дополнительный номер версии
    Dim dwBuildNumber As Integer        'Номер сборки
    Dim dwPlatformId As Integer     'Флажки для определения платформы Windows (Windows 95, Windows NT, и т.д.):
    Dim szCSDVersion As String  'Дополнительная информация о операционной системе
    End Structure
    Public Class Form1
    Public Const VER_PLATFORM_WIN32_WINDOWS As Integer = 1 'Windows 95 или 98
    Public Const VER_PLATFORM_WIN32_NT As Integer = 2    'Windows NT
    Declare Function GetVersionEx Lib "kernel32.dll" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Integer
    Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim windir As String ' путь папки Windows
    Dim slength As Integer ' длина возвращаемой строки
    windir = Space(255)  ' место для получения строки в буфере
    slength = GetWindowsDirectory(windir, 255) ' узнаем путь папки
    windir = (windir)  ' получаем имя из буфера
    TextBox1.Text = "Корневой каталог: " + windir
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim Ret As Long
    Dim strName As String
    Dim PlatForm As OSVERSIONINFO
    PlatForm.dwOSVersionInfoSize = Len(PlatForm) ' устанавливаем размер структуры
    Ret& = GetVersionEx(PlatForm)
    If Ret& = 0 Then TextBox2.Text = ("Error Getting Version Information") : Exit Sub 'Chack for errors
    Select Case PlatForm.dwPlatformId
    Case VER_PLATFORM_WIN32_WINDOWS
    strName = ("Windows 95/98")
    Case VER_PLATFORM_WIN32_NT
    strName = ("Windows NT")
    Case Else
    strName = ("Неизвестная ОС")
    End Select
    TextBox2.Text = "Платформа: " + strName
    End Sub
    End Class
    Добавлено: Ещё в списке ошибок вылазит
    Предупреждение1
    Переменная "PlatForm" используется до присвоения ей значения. Во время выполнения может произойти исключение при ссылке на значение NULL. Убедитесь, что структура и все ссылочные члены инициализированы.
     
  7. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    у меня работает ф-ция с типами как в примере, т.е. Long вместо Integer и строка с фиксированной длиной в структуре и Long в результате ф-ции (исправить в декларациях)
     
  8. Vyacheslavovich

    Vyacheslavovich Гость

    Вроде как всё заработало...
    Код (LotusScript):
    Imports System.Runtime.InteropServices
    Public Structure OSVERSIONINFOEX 'структура для функции GetVersionEx
    Public dwOSVersionInfoSize As UInteger 'размер структуры
    Public dwMajorVersion As UInteger 'Основной номер версии
    Public dwMinorVersion As UInteger 'ополнительный номер версии
    Public dwBuildNumber As UInteger 'Номер сборки
    Public dwPlatformId As UInteger 'Флажки для определения платформы Windows
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> _
    Public szCSDVersion As String 'строчное имя последнего сервис-пака, объявляется с использованием маршаллинга, чтобы заставить VB выделить память под строку в структуре (128 байт)
    Public wServicePackMajor As UInt16 'основная версия сервис-пака
    Public wServicePackMinor As UInt16 ' дополнительная версия сервис-пака
    Public wSuiteMask As UInt16 'флаги совместимости
    Public wProductType As Byte 'дополнительная информация о версии
    Public wReserved As Byte 'заразервировано для будующих версий windows
    End Structure
    Public Class Form1
    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef _
    lpVersionInformation As OSVERSIONINFOEX) As Integer
    Private Const VER_NT_WORKSTATION As UInteger = 1
    Private Const VER_PLATFORM_WIN32_NT As UInteger = 2
    Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim windir As String ' путь папки Windows
    Dim slength As Integer ' длина возвращаемой строки
    windir = Space(255)  ' место для получения строки в буфере
    slength = GetWindowsDirectory(windir, 255) ' узнаем путь папки
    windir = (windir)  ' получаем имя из буфера
    TextBox1.Text = "Корневой каталог: " + windir
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim Ret As UInteger
    Dim strName As String
    Dim PlatForm As OSVERSIONINFOEX
    PlatForm.dwOSVersionInfoSize = 156
    Ret = GetVersionEx(PlatForm)
    If Ret = 0 Then TextBox2.Text = ("Error Getting Version Information") : Exit Sub 'Chack for errors
    Select Case PlatForm.dwPlatformId
    Case VER_NT_WORKSTATION
    strName = ("NT_WORKSTATION")
    Case VER_PLATFORM_WIN32_NT
    strName = ("VER_PLATFORM_WIN32_NT")
    Case Else
    strName = ("Неизвестная ОС")
    End Select
    TextBox2.Text = "Платформа: " + strName
    End Sub
    End Class
     
Загрузка...

Поделиться этой страницей