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

📄 hwlocal.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        info->valid_sel = TRUE;
    } else {
        info->valid_sel = FALSE;
    }
    if( top >= LocalHeapCount ) top = 0;
    info->top = *LocalHeapList[top];
    return( TRUE );
}

/*
 * ReDisplayLocalHeapList - dump heap list into list box
 */
static void ReDisplayLocalHeapList( HWND boxhwnd, LocalStateStruct *info ) {

    unsigned    i;
    WORD        addr;

    if( info == NULL ) {
        SendMessage( boxhwnd, LB_SETTOPINDEX, 0, 0 );
        SendMessage( boxhwnd, LB_SETCURSEL, -1, 0 );
    }
    SetBoxCnt( boxhwnd, LocalHeapCount );
    if( info != NULL ) {
        addr = info->top.wAddress;
        for( i=0; i < LocalHeapCount; i++ ) {
            if( LocalHeapList[i]->wAddress == addr ) {
                SendMessage( boxhwnd, LB_SETTOPINDEX, i, 0 );
            }
        }
    }
}

/*
 * InitLocalHeapList - create a local heap list
 */

static BOOL InitLocalHeapList( HWND hwnd, HWND listhdl, BOOL keeppos )
{
    LOCALINFO           info;
    LOCALENTRY          item;
    LocalStateStruct    state;
    unsigned            size;
    unsigned            lim;
    BOOL                ret;

    /* get number of elements */
    info.dwSize = sizeof( LOCALINFO );
    info.wcItems = 0;
    if( keeppos ) {
        SaveLocalListState( listhdl, &state );
    }
    FreeLocalList();
    for( ;; ) {
        if( LocalInfo( &info, LocalHeapHandle ) == 0 ) break;
        lim = info.wcItems;
        size = lim * sizeof( LOCALENTRY * );
        LocalHeapList = MemAlloc( size );
        if( LocalHeapList == NULL ) break;
        memset( &item, 0, sizeof( LOCALENTRY ) );
        item.dwSize = sizeof( LOCALENTRY );
        LocalHeapCount = 0;
        if( LocalFirst( &item, LocalHeapHandle ) == 0 ) break;
        for( ;; ) {
            ret = AddToLocalHeapList( &item, LocalHeapCount );
            if( ret == FALSE ) break;
            LocalHeapCount ++;
            if( LocalHeapCount == lim ) break;
            if( LocalNext( &item ) == 0 ) break;
        }
        if( ret == FALSE ) break;
        SortLocalHeapList( hwnd, LSortType );
        ReDisplayLocalHeapList( listhdl, keeppos ? &state:NULL );
        return( TRUE );
    }
    ErrorBox( NULL, STR_UNABLE_DISP_LCL_HEAP, MB_OK | MB_ICONINFORMATION );
    return( FALSE );
} /* InitLocalHeapList */

/*
 * CreateLocalPushWin - create the push windows for the local heap window
 */
static HWND *CreateLocalPushWin( HWND hwnd ) {
    HWND        *ret;

    ret = MakePushWin( hwnd, HeapLocalTitles, 6,
                     HEAPMENU_SORT_ADDR, HEAPMENU_SORT_HANDLE,
                     HEAPMENU_SORT_SIZE, 0, 0, HEAPMENU_SORT_TYPE );
    return( ret );
}

/*
 * LocalHeapProc - process messages from the local heap window
 */

BOOL __export FAR PASCAL LocalHeapProc( HWND hwnd, WORD msg, WORD wparam,
                                    DWORD lparam ) {
    LclWndInfo          *info;
    LocalStateStruct    state;

    info = (LclWndInfo *)GetWindowLong( hwnd, 0 );
    switch( msg ) {
    case WM_CREATE:
        info = MemAlloc( sizeof( LclWndInfo ) );
        if( info == NULL ) {
            ErrorBox( NULL, STR_LCL_HEAP_NO_MEM, MB_OK | MB_ICONINFORMATION );
        }
        memset( info, 0, sizeof( LclWndInfo ) );
        SetWindowLong( hwnd, 0, (DWORD)info );
        EnableLocalMenu( FALSE );
        info->list.title = CreateLocalPushWin( hwnd );
        CreateListBox( hwnd, &(info->list), LOCAL_LB );
//      SetTitle( HeapLocalTitles, info->list.title );
        if( !InitLocalHeapList( hwnd, info->list.box, FALSE ) ) {
            DestroyWindow( hwnd );
        }
        break;
    case WM_ACTIVATEAPP:
        if( wparam ) {
            if( !InitLocalHeapList( hwnd, info->list.box, TRUE ) ) {
                DestroyWindow( hwnd );
            } else {
                SaveLocalListState( info->list.box, &state );
                ReDisplayLocalHeapList( info->list.box, &state );
            }
        }
        break;
    case WM_SHOWWINDOW:
        if( IsWindow( info->dialog ) ) {
            if( !wparam && LOWORD( lparam ) == SW_PARENTCLOSING ) {
                ShowWindow( info->dialog, SW_HIDE );
            } else if( wparam && LOWORD( lparam ) == SW_PARENTOPENING ) {
                ShowWindow( info->dialog, SW_SHOWNOACTIVATE );
            }
        }
        return( DefWindowProc( hwnd, msg, wparam, lparam ) );
    case WM_SIZE:
        ResizeListBox( LOWORD( lparam ), HIWORD( lparam ), &( info->list ) );
        return( DefWindowProc( hwnd, msg, wparam, lparam ) );
        break;
    case WM_COMMAND:
        switch( wparam ) {
        case HEAPMENU_GLOBAL_REFRESH:
            if( !InitLocalHeapList( hwnd, info->list.box, TRUE ) ) {
                DestroyWindow( hwnd );
            } else {
                SaveLocalListState( info->list.box, &state );
                ReDisplayLocalHeapList( info->list.box, &state );
            }
            break;
        case HEAPMENU_SORT_ADDR:
        case HEAPMENU_SORT_SIZE:
        case HEAPMENU_SORT_TYPE:
        case HEAPMENU_SORT_HANDLE:
            SortLocalHeapList( hwnd, wparam );
            ReDisplayLocalHeapList( info->list.box, NULL );
            break;
        case HEAPMENU_FILE_SAVE:
            SaveListBox( SLB_SAVE_TMP, PutOutLocalHeader, Config.lfname,
                         HeapWalkName, hwnd, info->list.box );
            break;
        case HEAPMENU_FILE_SAVE_TO:
            SaveListBox( SLB_SAVE_AS, PutOutLocalHeader, Config.lfname,
                         HeapWalkName, hwnd, info->list.box );
            break;
        case HEAPMENU_GLOBAL_MEMORYINFO:
            info->dialog = DisplayLocalHeapInfo( hwnd );
            break;
        case HEAPMENU_EXIT:
            DestroyWindow( hwnd );
            break;
        }
        break;
    case WM_DESTROY:
        KillPushWin( info->list.title );
        EnableLocalMenu( TRUE );
        MemFree( info );
        FreeLocalList();
        break;
    case WM_NCDESTROY:
        SendMessage( HeapWalkMainWindow, WM_USER, 0, 0 );
        LocalHeapHwnd = NULL;
        return( DefWindowProc( hwnd, msg, wparam, lparam ) );
        break;
    default:
        return( DefWindowProc( hwnd, msg, wparam, lparam ) );
    }
    return( TRUE );
}

void ResetLocalFont() {

    LclWndInfo          *info;

    if( LocalHeapHwnd != NULL ) {
        info = (LclWndInfo *)GetWindowLong( LocalHeapHwnd, 0 );
        KillPushWin( info->list.title );
        info->list.title = CreateLocalPushWin( LocalHeapHwnd );
        PositionListBox( &info->list, LocalHeapHwnd );
        SetBoxFont( info->list.box, GetMonoFont() );
    }
}

/*
 * LocalWalk - begin a walk of the local heap
 */

void LocalWalk( heap_list *item ) {

    char        title[30];
    int         width;
    int         hight;

    LocalHeapHandle = item->info.ge.hBlock;
    width = GetSystemMetrics( SM_CXSCREEN );
    hight = GetSystemMetrics( SM_CYSCREEN );
    strcpy( Owner, item->szModule );
    RCsprintf( title, STR_LCL_WIN_TITLE, Owner );
    LocalHeapHwnd = CreateWindow(
        LOCAL_DISPLAY_CLASS,    /* Window class name */
        title,          /* Window caption */
        WS_OVERLAPPED|WS_CAPTION
        |WS_SYSMENU|WS_THICKFRAME
        |WS_MAXIMIZEBOX,        /* Window style */
        width/8,                /* Initial X position */
        hight/3,                /* Initial Y position */
        3*width/4,              /* Initial X size */
        hight/3,                /* Initial Y size */
        HeapWalkMainWindow,     /* Parent window handle */
        NULL,                   /* Window menu handle */
        Instance,               /* Program instance handle */
        NULL);                  /* Create parameters */
    if( LocalHeapHwnd == NULL ) {
        RCMessageBox( NULL, STR_CANT_OPEN_LCL_WIN, HeapWalkName,
                    MB_OK | MB_TASKMODAL | MB_ICONINFORMATION );
    }
    ShowWindow( LocalHeapHwnd, SW_SHOWNORMAL );
    UpdateWindow( LocalHeapHwnd );
} /* LocalWalk */

⌨️ 快捷键说明

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