Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: GlobalMemoryStatusEX Добавлено: 19.04.11 20:32  

Автор вопроса:  Igor
Возникла трудность при считывании текущей информации о физической памяти системы. При ОЗУ до 2Гб работает GlobalMemoryStatus, если более 2Гб то предполагается использование GlobalMemoryStatusEX. Код написан следующий:

Public Declare Function MEMSTAT Lib "kernel32.dll" _
    Alias "GlobalMemoryStatus" (ByVal lpBuffer As MEMORYSTATUS) As Boolean

    Public Structure MEMORYSTATUS
        Public dwLength As UInt32
        Public dwMemoryLoad As UInt32
        Public dwTotalPhys As UInt32
        Public dwAvailPhys As UInt32
        Public dwTotalPageFile As UInt32
        Public dwAvailPageFile As UInt32
        Public dwTotalVirtual As UInt32
        Public dwAvailVirtual As UInt32
    End Structure

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim MemoryInfo As MEMORYSTATUS
        Call MEMSTAT(MemoryInfo)
End Sub

При замене GlobalMemoryStatus на GlobalMemoryStatusEX данный код не работает, выдает:
Не удается найти точку входа "GlobalMemoryStatusex" в DLL "kernel32.dll". (покапался в kernel32.dll данная точка входа имеется)

думается что я неправильно вызываю внутреннюю команду.

Прошу прощения за большой объем сообщения.

Ответить

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

Номер ответа: 1
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #1
Добавлено: 19.04.11 22:01
во-первых, перед вызовом нужно заполнить поле dwLength
  1. MEMORYSTATUSEX statex;
  2. statex.dwLength = sizeof (statex);


во-вторых, большинство полей MEMORYSTATUSEX - 64битные
http://msdn.microsoft.com/en-us/library/aa366770(v=vs.85).aspx
для vb6:
  1. Private Type INT64
  2.     LoPart As Long
  3.     HiPart As Long
  4. End Type
  5. Private Type MEMORYSTATUSEX
  6.     dwLength As Long
  7.     dwMemoryLoad As Long
  8.     ulTotalPhys As INT64
  9.     ulAvailPhys As INT64
  10.     ulTotalPageFile As INT64
  11.     ulAvailPageFile As INT64
  12.     ulTotalVirtual As INT64
  13.     ulAvailVirtual As INT64
  14.     UlAvailExtendedVirtual As INT64
  15. End Type


в-третьих, не знаю как в дотнете, но на шестёре ссылка на UDT передаётся ByRef, а тут ByVal

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 20.04.11 23:29
C#,FW 4.0
  1.  
  2. using System;
  3. using System.Runtime.InteropServices;
  4. using System.Text;
  5.  
  6. namespace ConsoleApplication1
  7. {
  8.     class Program
  9.     {
  10.  
  11.         [DllImport("kernel32.dll", SetLastError = true)]
  12.         [return: MarshalAs(UnmanagedType.Bool)]
  13.         public static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX buffer);
  14.  
  15.         static void Main(string[] args)
  16.         {
  17.             var info = new MEMORYSTATUSEX();
  18.             Console.WriteLine(GlobalMemoryStatusEx(info) ? info.ToString() : "Doesn't work :o( ");
  19.             Console.ReadLine();
  20.         }
  21.     }
  22.  
  23.     [StructLayout(LayoutKind.Sequential)]
  24.     public class MEMORYSTATUSEX
  25.     {
  26.         public uint dwLength;
  27.         public uint dwMemoryLoad;
  28.         public ulong ullTotalPhys;
  29.         public ulong ullAvailPhys;
  30.         public ulong ullTotalPageFile;
  31.         public ulong ullAvailPageFile;
  32.         public ulong ullTotalVirtual;
  33.         public ulong ullAvailVirtual;
  34.         public ulong ullAvailExtendedVirtual;
  35.  
  36.         public MEMORYSTATUSEX()
  37.         {
  38.             dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
  39.         }
  40.  
  41.         public override string ToString()
  42.         {
  43.             var builder = new StringBuilder();
  44.             builder.AppendFormat("Mem loaded: {0}%.\r\n", dwMemoryLoad);
  45.             builder.AppendFormat("Total phys mem: {0}.\r\n", ullTotalPhys);
  46.             builder.AppendFormat("Available phys mem: {0}.\r\n", ullAvailPhys);
  47.             builder.AppendFormat("Total page file: {0}.\r\n", ullTotalPageFile);
  48.             builder.AppendFormat("Available page file: {0}.\r\n", ullAvailPageFile);
  49.             builder.AppendFormat("Total virtual mem: {0}.\r\n", ullTotalVirtual);
  50.             builder.AppendFormat("Available virtual mem: {0}.\r\n", ullAvailVirtual);
  51.             builder.AppendFormat("Available extended virtual mem: {0}.\r\n", ullAvailExtendedVirtual);
  52.             return builder.ToString();
  53.         }
  54.     }
  55. }




Mem loaded: 23%.
Total phys mem: 3487621120.
Available phys mem: 1631080448.
Total page file: 6973435904.
Available page file: 4538019840.
Total virtual mem: 2147352576.
Available virtual mem: 1969078272.
Available extended virtual mem: 0.

Ответить

Страница: 1 |

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



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