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

  • Автор темы Vyacheslavovich
  • Дата начала
V

Vyacheslavovich

#1
На разных платформах при попытке получить версию платформы выдаёт ошибку: Попытка чтения или записи в защищённую память.... Может кто-нить глянет, где ошибка?? И как функция GetVersionEx работает в Windows 7 x64???
Код:
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
 

hosm

* so what *
18.05.2009
2 442
6
#2
а где тут есть вызов ф-ции GetVersionEx? тут только ее декларации приведены.
 
V

Vyacheslavovich

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

hosm

* so what *
18.05.2009
2 442
6
#4
Размер передаваемой структуры не указан.
An OSVERSIONINFO or OSVERSIONINFOEX structure that receives the operating system information.
Before calling the GetVersionEx function, set the dwOSVersionInfoSize member of the structure as appropriate to indicate which data structure is being passed to this function.
Return value
If the function succeeds, the return value is a nonzero value.
If the function fails, the return value is zero. To get extended error information, call GetLastError. The function fails if you specify an invalid value for the dwOSVersionInfoSize member of the OSVERSIONINFO or OSVERSIONINFOEX structure.
вот пример есть:
Код:
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
 
V

Vyacheslavovich

#6
Ничего не выходит..
Код:
'Chack for errors
If Ret& = 0 Then MsgBox "Error Getting Version Information": Exit Sub
'Print the information to the form
Постоянно ошибку выдаёт при проверке
Код:
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. Убедитесь, что структура и все ссылочные члены инициализированы.
 

hosm

* so what *
18.05.2009
2 442
6
#7
у меня работает ф-ция с типами как в примере, т.е. Long вместо Integer и строка с фиксированной длиной в структуре и Long в результате ф-ции (исправить в декларациях)
 
V

Vyacheslavovich

#8
Вроде как всё заработало...
Код:
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