⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 Extended C/C++ Dynamic Memory Control And Debug Library
💻 CS
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************/
/*
    XMEM Browser for extended C/C++ Dynamic Memory Control And Debug Library

    Copyright (C) Juergen Mueller (J.M.) 1987-2008
    All rights reserved.

    You are expressly prohibited from selling this software in any form
    or removing this notice.

    THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
    EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE
    IMPLIED WARRANTIES OF MERCHANTIBILITY, FITNESS FOR A PARTICULAR
    PURPOSE, OR NON-INFRINGEMENT. THE AUTHOR SHALL NOT BE LIABLE FOR
    ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
    OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. THE ENTIRE RISK
    AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM AND DOCUMENTATION
    IS WITH YOU.

    Permission to modify the code and to distribute modified code is granted,
    provided the above notices are retained, and a notice that the code was
    modified is included with the above copyright notice.

    written by: Juergen Mueller, D-70806 Kornwestheim, GERMANY

    FILE       : XMEMBrowser
    REVISION   : 20-May-2008
                 21:05:57
 */
/*****************************************************************************/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace XMEMBrowser
{
  public partial class Form1 : Form
  {
    private const int XMEM_MSG_COUNTERS = 1;
    private const int XMEM_MSG_STATS    = 2;
    private const int XMEM_MSG_TEXT     = 3;
    private const int XMEM_MSG_LOG      = 4;

    // The WM_COPYDATA constant.
    private const int WM_COPYDATA = 0x4A;

    // The struct used to marshal data between applications using the windows messaging API.
    [StructLayout(LayoutKind.Sequential)]
    private struct COPYDATASTRUCT
    {
      public IntPtr dwData;
      public int    cbData;
      public IntPtr lpData;
    }
    private COPYDATASTRUCT dataStruct;

    [StructLayout(LayoutKind.Sequential)]
    private struct S_COUNTERS
    {
      public uint sum_progmem;            /* overall # of bytes allocated */
      public uint act_progmem;            /* actual # of bytes allocated */
      public uint total_progmem;          /* maximum # of bytes allocated from program */
      public uint total_memory;           /* total # of bytes allocated */
      public uint total_alloc;            /* # of alloc, program + memcontrol */
      public uint total_progalloc;        /* # of alloc from program, done */
      public uint total_alloc_call;       /* # of alloc calls from program */
      public uint total_realloc_call;     /* # of alloc calls from program */
      public uint total_expand_call;      /* # of alloc calls from program */
      public uint total_free;             /* # of free, program + memcontrol */
      public uint total_progfree;         /* # of free from program, done */
      public uint total_free_call;        /* # of free calls from program */
      public uint total_realloc_NULL;     /* # of realloc calls with NULL */
      public uint total_expand_NULL;      /* # of _expand calls with NULL */
      public uint malloc_call;
      public uint calloc_call;
      public uint realloc_call;
      public uint expand_call;
      public uint alloca_call;
      public uint free_call;
      public uint new_call;
      public uint new_array_call;
      public uint delete_call;
      public uint delete_array_call;
      public uint strdup_call;
    }
    private S_COUNTERS s_counters_Struct;

    private const int STATSLOTS = 13;   /* number of elements in S_STATS */

    [StructLayout(LayoutKind.Sequential)]
    private struct S_STATS
    {
      public uint s_0;
      public uint s_1;
      public uint s_6;
      public uint s_11;
      public uint s_51;
      public uint s_101;
      public uint s_501;
      public uint s_1001;
      public uint s_5001;
      public uint s_10001;
      public uint s_50001;
      public uint s_100001;
      public uint s_500001;
      public uint s_1000001;
    }
    private S_STATS s_stats_Struct;

    private const int LIMIT_MESSAGE_INFO = 10000;
    private int limit_message_info = LIMIT_MESSAGE_INFO;
    private int new_limit_message_info = LIMIT_MESSAGE_INFO;
    private const int LIMIT_LOG_INFO = 10000;
    private int limit_log_info = LIMIT_LOG_INFO;
    private int new_limit_log_info = LIMIT_LOG_INFO;

    private uint count_call_stats = 0;
    private uint count_size_stats = 0;
    private uint count_message = 0;
    private uint count_log = 0;
    private string received_messages;

    private char[] delimiters1 = { '\n' };
    private char[] delimiters2 = { ',', '\n' };

    private bool process_message_info = true;
    private bool process_log_info = true;
    private bool process_call_info = true;
    private bool process_size_info = true;
    private bool process_all_info = true;

    public Form1()
    {
      InitializeComponent();

      checkBoxProcessMessageInfo.Checked = process_message_info;
      checkBoxProcessLogInfo.Checked = process_log_info;
      checkBoxProcessCallInfo.Checked = process_log_info;
      checkBoxProcessSizeInfo.Checked = process_size_info;
      checkBoxProcessAllInfo.Checked = process_all_info;

      textBoxMaxMessageCount.Text = limit_message_info.ToString();
      textBoxActualMaxMessageCount.Text = new_limit_message_info.ToString();
      textBoxMaxLogCount.Text = limit_log_info.ToString();
      textBoxActualMaxLogCount.Text = new_limit_log_info.ToString();

      received_messages_info();

      MainMenu mainMenu = new MainMenu();
      MenuItem menuItemAbout = new MenuItem();
      menuItemAbout.Text = "About";
      menuItemAbout.Click += new System.EventHandler(this.menuItemAbout_Click);
      mainMenu.MenuItems.Add(menuItemAbout);
      Menu = mainMenu;  
    }

    protected override void WndProc(ref Message message)
    {
      if (message.Msg == WM_COPYDATA)
      {
        // copy the Windows Message WM_COPYDATA data exchange structure
        dataStruct = (COPYDATASTRUCT)Marshal.PtrToStructure(message.LParam, typeof(COPYDATASTRUCT));
        int msg_id = (int)(dataStruct.dwData);

        switch(msg_id)
        {
          case XMEM_MSG_COUNTERS:
          {
            ++count_call_stats;

            if (process_call_info == false)
            {
              break;
            }

            s_counters_Struct = (S_COUNTERS)Marshal.PtrToStructure(dataStruct.lpData, typeof(S_COUNTERS));

            sum_progmem.Text = s_counters_Struct.sum_progmem.ToString();
            act_progmem.Text = s_counters_Struct.act_progmem.ToString();
            total_progmem.Text = s_counters_Struct.total_progmem.ToString();
            total_memory.Text = s_counters_Struct.total_memory.ToString();
            total_alloc.Text = s_counters_Struct.total_alloc.ToString();
            total_progalloc.Text = s_counters_Struct.total_progalloc.ToString();
            total_alloc_call.Text = s_counters_Struct.total_alloc_call.ToString();
            total_realloc_call.Text = s_counters_Struct.total_realloc_call.ToString();
            total_expand_call.Text = s_counters_Struct.total_expand_call.ToString();
            total_free.Text = s_counters_Struct.total_free.ToString();
            total_progfree.Text = s_counters_Struct.total_progfree.ToString();
            total_free_call.Text = s_counters_Struct.total_free_call.ToString();
            total_realloc_NULL.Text = s_counters_Struct.total_realloc_NULL.ToString();
            total_expand_NULL.Text = s_counters_Struct.total_expand_NULL.ToString();
            malloc_call.Text = s_counters_Struct.malloc_call.ToString();
            calloc_call.Text = s_counters_Struct.calloc_call.ToString();
            realloc_call.Text = s_counters_Struct.realloc_call.ToString();
            expand_call.Text = s_counters_Struct.expand_call.ToString();
            alloca_call.Text = s_counters_Struct.alloca_call.ToString();
            free_call.Text = s_counters_Struct.free_call.ToString();
            new_call.Text = s_counters_Struct.new_call.ToString();
            new_array_call.Text = s_counters_Struct.new_array_call.ToString();
            delete_call.Text = s_counters_Struct.delete_call.ToString();
            delete_array_call.Text = s_counters_Struct.delete_array_call.ToString();
            strdup_call.Text = s_counters_Struct.strdup_call.ToString();

            received_messages_info();
            break;
          }

          case XMEM_MSG_STATS:
          {
            ++count_size_stats;

            if (process_size_info == false)
            {
              break;
            }

            uint total = 0;

            s_stats_Struct = (S_STATS)Marshal.PtrToStructure(dataStruct.lpData, typeof(S_STATS));

            size_0.Text = s_stats_Struct.s_0.ToString();
            total += s_stats_Struct.s_0;

            size_1.Text = s_stats_Struct.s_1.ToString();
            total += s_stats_Struct.s_1;

            size_6.Text = s_stats_Struct.s_6.ToString();
            total += s_stats_Struct.s_6;

            size_11.Text = s_stats_Struct.s_11.ToString();
            total += s_stats_Struct.s_11;

            size_51.Text = s_stats_Struct.s_51.ToString();
            total += s_stats_Struct.s_51;

            size_101.Text = s_stats_Struct.s_101.ToString();
            total += s_stats_Struct.s_101;

            size_501.Text = s_stats_Struct.s_501.ToString();
            total += s_stats_Struct.s_501;

            size_1001.Text = s_stats_Struct.s_1001.ToString();
            total += s_stats_Struct.s_1001;

            size_5001.Text = s_stats_Struct.s_5001.ToString();
            total += s_stats_Struct.s_5001;

            size_10001.Text = s_stats_Struct.s_10001.ToString();
            total += s_stats_Struct.s_10001;

            size_50001.Text = s_stats_Struct.s_50001.ToString();
            total += s_stats_Struct.s_50001;

            size_100001.Text = s_stats_Struct.s_100001.ToString();
            total += s_stats_Struct.s_100001;

            size_500001.Text = s_stats_Struct.s_500001.ToString();
            total += s_stats_Struct.s_500001;

            size_1000001.Text = s_stats_Struct.s_1000001.ToString();
            total += s_stats_Struct.s_1000001;

            if (total == 0)
            {
              total = 1;
            }

            double value;

            value = s_stats_Struct.s_0 * 100.0 / (double)total;
            proz_0.Text = value.ToString("0.00");
            progressBar_0.Value = (int)value;

            value = s_stats_Struct.s_1 * 100.0 / (double)total;
            proz_1.Text = value.ToString("0.00");
            progressBar_1.Value = (int)value;

            value = s_stats_Struct.s_6 * 100.0 / (double)total;
            proz_6.Text = value.ToString("0.00");
            progressBar_6.Value = (int)value;

            value = s_stats_Struct.s_11 * 100.0 / (double)total;
            proz_11.Text = value.ToString("0.00");
            progressBar_11.Value = (int)value;

            value = s_stats_Struct.s_51 * 100.0 / (double)total;
            proz_51.Text = value.ToString("0.00");
            progressBar_51.Value = (int)value;

            value = s_stats_Struct.s_101 * 100.0 / (double)total;
            proz_101.Text = value.ToString("0.00");
            progressBar_101.Value = (int)value;

            value = s_stats_Struct.s_501 * 100.0 / (double)total;
            proz_501.Text = value.ToString("0.00");
            progressBar_501.Value = (int)value;

            value = s_stats_Struct.s_1001 * 100.0 / (double)total;
            proz_1001.Text = value.ToString("0.00");
            progressBar_1001.Value = (int)value;

            value = s_stats_Struct.s_5001 * 100.0 / (double)total;
            proz_5001.Text = value.ToString("0.00");
            progressBar_5001.Value = (int)value;

            value = s_stats_Struct.s_10001 * 100.0 / (double)total;
            proz_10001.Text = value.ToString("0.00");
            progressBar_10001.Value = (int)value;

            value = s_stats_Struct.s_50001 * 100.0 / (double)total;
            proz_50001.Text = value.ToString("0.00");
            progressBar_50001.Value = (int)value;

            value = s_stats_Struct.s_100001 * 100.0 / (double)total;
            proz_100001.Text = value.ToString("0.00");
            progressBar_100001.Value = (int)value;

            value = s_stats_Struct.s_500001 * 100.0 / (double)total;
            proz_500001.Text = value.ToString("0.00");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -