comctl32!ListView_OnSetItem函数分析LISTSUBITEM结构中的image表示图标位置

第一部分:
BOOL ListView_SetSubItem(LV* plv, const LV_ITEM* plvi)
{
    LISTSUBITEM lsi;
    BOOL fChanged = FALSE;
    int i;
    int idpa;
    HDPA hdpa;

    if (plvi->mask & ~(LVIF_DI_SETITEM | LVIF_TEXT | LVIF_IMAGE | LVIF_STATE))
    {
        RIPMSG(0, "ListView: Invalid mask: %04x", plvi->mask);
        return FALSE;
    }

    if (!(plvi->mask & (LVIF_TEXT | LVIF_IMAGE | LVIF_STATE)))
        return TRUE;

    i = plvi->iItem;
    if (!ListView_IsValidItemNumber(plv, i))
    {
        RIPMSG(0, "LVM_SETITEM: Invalid iItem: %d", plvi->iItem);
        return FALSE;
    }

    // sub item indices are 1-based...
    //
    idpa = plvi->iSubItem - 1;
    if (idpa < 0 || idpa >= plv->cCol - 1)
    {
        RIPMSG(0, "LVM_SETITEM: Invalid iSubItem: %d", plvi->iSubItem);
        return FALSE;
    }

    hdpa = ListView_GetSubItemDPA(plv, idpa);
    if (!hdpa)
    {
        hdpa = DPA_CreateEx(LV_HDPA_GROW, plv->hheap);
        if (!hdpa)
            return FALSE;

        DPA_SetPtr(plv->hdpaSubItems, idpa, (void*)hdpa);
    }

    ListView_GetSubItem(plv, i, plvi->iSubItem, &lsi);

    if (plvi->mask & LVIF_TEXT) {
        if (lsi.pszText != plvi->pszText) {
            Str_Set(&lsi.pszText, plvi->pszText);
            fChanged = TRUE;
        }
    }

    if (plvi->mask & LVIF_IMAGE) {
        if (plvi->iImage != lsi.iImage) {
            lsi.iImage = (short) plvi->iImage;
            fChanged = TRUE;
        }
    }

    if (plvi->mask & LVIF_STATE) {
        DWORD dwChange;

        dwChange = (lsi.state ^ plvi->state ) & plvi->stateMask;

        if (dwChange) {
            lsi.state ^= dwChange;
            fChanged = TRUE;
        }
    }

    if (fChanged) {
        PLISTSUBITEM plsiReal = DPA_GetPtr(hdpa, i);
        if (!plsiReal) {
            plsiReal = LocalAlloc(LPTR, sizeof(LISTSUBITEM));
            if (!plsiReal) {
                // fail!  bail out
                return FALSE;
            }
        }
        *plsiReal = lsi;
        if (!DPA_SetPtr(hdpa, i, (void*)plsiReal)) {

            ListView_FreeSubItem(plsiReal);
            return FALSE;
        }
    }

    // all's well... let's invalidate this
    if (ListView_IsReportView(plv)) {
        RECT rc;
        ListView_RGetRectsEx(plv, plvi->iItem, plvi->iSubItem, NULL, &rc);
        RedrawWindow(plv->ci.hwnd, &rc, NULL, RDW_ERASE | RDW_INVALIDATE);
    }
    else if (ListView_IsTileView(plv))
    {
        LISTITEM *pitem = ListView_GetItemPtr(plv, i);
        if (pitem)
        {
            ListView_SetSRecompute(pitem);
            // For tile view, we need to recompute the item
            plv->rcView.left = RECOMPUTE;
        
            if (plv->iItemDrawing != i)
                ListView_InvalidateItemEx(plv, i, FALSE, RDW_ERASE | RDW_INVALIDATE, LVIF_TEXT);
        }
    }
    return TRUE;
}


// ListView Item structure

#define LVIF_TEXT           0x0001  // LV_ITEM.mask flags (indicate valid fields in LV_ITEM)
#define LVIF_IMAGE          0x0002
#define LVIF_PARAM          0x0004
#define LVIF_STATE          0x0008

第二部分:
0: kd> dx -id 0,0,896d1020 -r1 ((comctl32!_LV *)0x108d88)
((comctl32!_LV *)0x108d88)                 : 0x108d88 [Type: _LV *]
    [+0x000] ci               [Type: tagControlInfo]
    [+0x024 ( 0: 0)] fNoDismissEdit   : 0x0 [Type: unsigned long]
    [+0x024 ( 1: 1)] fButtonDown      : 0x1 [Type: unsigned long]
    [+0x024 ( 2: 2)] fOneClickOK      : 0x1 [Type: unsigned long]
    [+0x024 ( 3: 3)] fOneClickHappened : 0x0 [Type: unsigned long]
    [+0x024 ( 4: 4)] fPlaceTooltip    : 0x0 [Type: unsigned long]
    [+0x024 ( 5: 5)] fImgCtxComplete  : 0x0 [Type: unsigned long]
    [+0x024 ( 6: 6)] fNoEmptyText     : 0x0 [Type: unsigned long]
    [+0x024 ( 7: 7)] fGroupView       : 0x0 [Type: unsigned long]
    [+0x024 ( 8: 8)] fIconsPositioned : 0x1 [Type: unsigned long]
    [+0x024 ( 9: 9)] fInsertAfter     : 0x0 [Type: unsigned long]
    [+0x024 (10:10)] fListviewAlphaSelect : 0x0 [Type: unsigned long]
    [+0x024 (11:11)] fListviewShadowText : 0x0 [Type: unsigned long]
    [+0x024 (12:12)] fListviewWatermarkBackgroundImages : 0x0 [Type: unsigned long]
    [+0x024 (13:13)] fListviewEnableWatermark : 0x0 [Type: unsigned long]
    [+0x024 (14:14)] fInFixIScrollPositions : 0x0 [Type: unsigned long]
    [+0x028] wView            : 0x0 [Type: unsigned short]
    [+0x02c] hdpa             : 0x1086d8 [Type: _DPA *]            [+0x02c] hdpa             : 0x1086d8 [Type: _DPA *]
  ......
    [+0x2fc] iLastId          : 0x0 [Type: unsigned long]
    [+0x300] iIncrement       : 0xffffffff [Type: unsigned long]
0: kd> dx -id 0,0,896d1020 -r1 ((comctl32!_DPA *)0x1086d8)
((comctl32!_DPA *)0x1086d8)                 : 0x1086d8 [Type: _DPA *]
    [+0x000] cp               : 22 [Type: int]
    [+0x004] pp               : 0x10b900 [Type: void * *]
    [+0x008] hheap            : 0x80000 [Type: void *]
    [+0x00c] cpAlloc          : 32 [Type: int]
    [+0x010] cpGrow           : 64 [Type: int]
    [+0x014] magic            : 0x4150 [Type: unsigned int]
0: kd> dd 0x10b900
0010b900  0010b590 0010b7f8 0010b850 0010b2f0
0010b910  0010ba10 0010ba68 0010bac0 000d64b8
0010b920  0010b380 0010b3d8 0010b430 0010b488
0010b930  0010b4e0 0010b538 0010b5e8 0010b640
0010b940  0010b698 0010b6f0 0010b748 0010b7a0
0010b950  0010b8a8 00118718 00000000 00000000
0010b960  00000000 00000000 00000000 00000000


第三部分:
一共两列:iImage表示位置,从左到右的相对位置

第二列:
0: kd> dt LISTSUBITEM 00118718
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x000d3818  -> 0x4e
   +0x004 iImage           : 0n621
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> dx -id 0,0,896d1020 -r1 (*((comctl32!tagSIZE *)0x118720))
(*((comctl32!tagSIZE *)0x118720))                 [Type: tagSIZE]
    [+0x000] cx               : 77 [Type: long]
    [+0x004] cy               : 7864319 [Type: long]
0: kd> db 0x000d3818
000d3818  4e 00 65 00 77 00 20 00-54 00 65 00 78 00 74 00  N.e.w. .T.e.x.t.
000d3828  20 00 44 00 6f 00 63 00-75 00 6d 00 65 00 6e 00   .D.o.c.u.m.e.n.
000d3838  74 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00  t...t.x.t.......

0: kd> dt LISTSUBITEM 0010b8a8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001098c8  -> 0x53
   +0x004 iImage           : 0n546
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001098c8
001098c8  53 00 49 00 50 00 4f 00-42 00 4a 00 2e 00 44 00  S.I.P.O.B.J...D.
001098d8  42 00 47 00 00 00 52 00-05 00 04 00 49 01 0c 00  B.G...R.....I...

0: kd> dt LISTSUBITEM 0010b7a0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001098a0  -> 0x70
   +0x004 iImage           : 0n471
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001098a0
001098a0  70 00 61 00 67 00 65 00-66 00 69 00 6c 00 65 00  p.a.g.e.f.i.l.e.
001098b0  2e 00 73 00 79 00 73 00-00 00 00 00 00 00 00 00  ..s.y.s.........

0: kd> dt LISTSUBITEM 0010b748
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109888  -> 0x6e
   +0x004 iImage           : 0n396
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109888
00109888  6e 00 74 00 6c 00 64 00-72 00 00 00 00 00 00 00  n.t.l.d.r.......
00109898  05 00 03 00 46 01 0e 00-70 00 61 00 67 00 65 00  ....F...p.a.g.e.

0: kd> dt LISTSUBITEM 0010b6f0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109860  -> 0x4e
   +0x004 iImage           : 0n321
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109860
00109860  4e 00 54 00 44 00 45 00-54 00 45 00 43 00 54 00  N.T.D.E.T.E.C.T.
00109870  2e 00 43 00 4f 00 4d 00-00 00 00 00 00 00 00 00  ..C.O.M.........

0: kd> dt LISTSUBITEM 0010b698
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109840  -> 0x4d
   +0x004 iImage           : 0n246
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109840
00109840  4d 00 53 00 44 00 4f 00-53 00 2e 00 53 00 59 00  M.S.D.O.S...S.Y.
00109850  53 00 00 00 00 00 00 00-05 00 04 00 5e 01 0e 00  S...........^...

0: kd> dt LISTSUBITEM 0010b640
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109828  -> 0x49
   +0x004 iImage           : 0n171
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109828
00109828  49 00 4f 00 2e 00 53 00-59 00 53 00 00 00 0d 77  I.O...S.Y.S....w


0: kd>  dt LISTSUBITEM 0010b5e8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109808  -> 0x65
   +0x004 iImage           : 0n96
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE

0: kd> db 0x00109808
00109808  65 00 76 00 65 00 6e 00-74 00 2e 00 74 00 78 00  e.v.e.n.t...t.x.
00109818  74 00 00 00 00 00 00 00-03 00 04 00 51 01 0a 00  t...........Q...


0: kd>  dt LISTSUBITEM 0010b538
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001097e8  -> 0x43
   +0x004 iImage           : 0n21
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001097e8
001097e8  43 00 4f 00 4e 00 46 00-49 00 47 00 2e 00 53 00  C.O.N.F.I.G...S.
001097f8  59 00 53 00 00 00 00 00-04 00 04 00 55 01 0c 00  Y.S.........U...


第二列:
0: kd> dt LISTSUBITEM 0010b4e0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001097c8  -> 0x62
   +0x004 iImage           : 0n921
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001097c8
001097c8  62 00 6f 00 6f 00 74 00-2e 00 69 00 6e 00 69 00  b.o.o.t...i.n.i.


0: kd>  dt LISTSUBITEM 0010b488
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001097a0  -> 0x41
   +0x004 iImage           : 0n846
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001097a0
001097a0  41 00 55 00 54 00 4f 00-45 00 58 00 45 00 43 00  A.U.T.O.E.X.E.C.
001097b0  2e 00 42 00 41 00 54 00-00 00 00 00 00 00 00 00  ..B.A.T.........


0: kd>  dt LISTSUBITEM 0010b430
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109788  -> 0x36
   +0x004 iImage           : 0n771
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109788
00109788  36 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00  6...t.x.t.......


0: kd>  dt LISTSUBITEM 0010b3d8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109770  -> 0x34
   +0x004 iImage           : 0n696
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109770
00109770  34 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00  4...t.x.t.......


0: kd>  dt LISTSUBITEM 0010b380
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109758  -> 0x32
   +0x004 iImage           : 0n621
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109758
00109758  32 00 2e 00 74 00 78 00-74 00 00 00 2a 97 2e 77  2...t.x.t...*..w
00109768  03 00 03 00 b8 01 0c 00-34 00 2e 00 74 00 78 00  ........4...t.x.


0: kd>  dt LISTSUBITEM 000d64b8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109740  -> 0x31
   +0x004 iImage           : 0n546
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109740
00109740  31 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00  1...t.x.t.......
00109750  03 00 03 00 bf 01 0c 00-32 00 2e 00 74 00 78 00  ........2...t.x.

0: kd>  dt LISTSUBITEM 0010bac0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109728  -> 0x77
   +0x004 iImage           : 0n471
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109728
00109728  77 00 6d 00 70 00 75 00-62 00 00 00 ac 87 2a 77  w.m.p.u.b.....*w
00109738  03 00 03 00 b2 01 0c 00-31 00 2e 00 74 00 78 00  ........1...t.x.


0: kd>  dt LISTSUBITEM 0010ba68
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x000f4280  -> 0x57
   +0x004 iImage           : 0n396
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x000f4280
000f4280  57 00 49 00 4e 00 44 00-4f 00 57 00 53 00 00 00  W.I.N.D.O.W.S...


0: kd>  dt LISTSUBITEM 0010ba10
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x0010b158  -> 0x74
   +0x004 iImage           : 0n321
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x0010b158
0010b158  74 00 66 00 74 00 70 00-64 00 72 00 6f 00 6f 00  t.f.t.p.d.r.o.o.
0010b168  74 00 00 00 00 00 00 00-b8 56 10 00 78 8d 10 00  t........V..x...


0: kd>  dt LISTSUBITEM 0010b2f0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001096e8  -> 0x53
   +0x004 iImage           : 0n246
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001096e8
001096e8  53 00 79 00 73 00 74 00-65 00 6d 00 20 00 56 00  S.y.s.t.e.m. .V.
001096f8  6f 00 6c 00 75 00 6d 00-65 00 20 00 49 00 6e 00  o.l.u.m.e. .I.n.
00109708  66 00 6f 00 72 00 6d 00-61 00 74 00 69 00 6f 00  f.o.r.m.a.t.i.o.
00109718  6e 00 00 00 00 02 00 00-03 00 08 00 b1 01 0c 00  n...............


0: kd>  dt LISTSUBITEM 0010b850
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109b58  -> 0x52
   +0x004 iImage           : 0n171
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109b58
00109b58  52 00 45 00 43 00 59 00-43 00 4c 00 45 00 52 00  R.E.C.Y.C.L.E.R.
00109b68  00 00 00 00 00 00 00 00-08 00 04 00 3b 01 08 00  ............;...

0: kd>  dt LISTSUBITEM 0010b7f8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001056a0  -> 0x50
   +0x004 iImage           : 0n96
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001056a0
001056a0  50 00 72 00 6f 00 67 00-72 00 61 00 6d 00 20 00  P.r.o.g.r.a.m. .
001056b0  46 00 69 00 6c 00 65 00-73 00 00 00 78 8d 10 00  F.i.l.e.s...x...

0: kd>  dt LISTSUBITEM 0010b590
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x0010b348  -> 0x44
   +0x004 iImage           : 0n21
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE

0: kd> db 0x0010b348
0010b348  44 00 6f 00 63 00 75 00-6d 00 65 00 6e 00 74 00  D.o.c.u.m.e.n.t.
0010b358  73 00 20 00 61 00 6e 00-64 00 20 00 53 00 65 00  s. .a.n.d. .S.e.
0010b368  74 00 74 00 69 00 6e 00-67 00 73 00 00 00 00 00  t.t.i.n.g.s.....

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】大数据查重

大数据查重 哈希表 找出第一个出现重复的数字 || 找所有重复出现的数字 #include <iostream> #include <vector> #include <unordered_map> #include <unordered_set> #include <stdlib.h> #include <time.h> #include <string> …

模型微调-基于LLaMA-Factory进行微调的一个简单案例

模型微调-基于LLaMA-Factory进行微调的一个简单案例 1. 租用云计算资源2. 拉取 LLaMa-Factory3. 安装依赖环境4. 启动 LLaMa-Factory 界面5. 从 Huggingface 下载模型6. 模型验证7. 模型微调 1. 租用云计算资源 以下示例基于 AutoDL 云计算资源。 在云计算平台选择可用的云计…

【单片机】ARM 处理器简介

ARM 公司简介 ARM&#xff08;Advanced RISC Machine&#xff09; 是英国 ARM 公司&#xff08;原 Acorn RISC Machine&#xff09; 开发的一种精简指令集&#xff08;RISC&#xff09; 处理器架构。ARM 处理器因其低功耗、高性能、广泛适用性&#xff0c;成为嵌入式系统、移动…

springboot的实体类字段校验的分组校验

分组校验&#xff08;Group Validation&#xff09;允许在不同的场景下对同一个实体类应用不同的校验规则。例如&#xff0c;在新增数据和更新数据时&#xff0c;可能需要对某些字段的校验规则进行调整。以下是分组校验的具体实现步骤&#xff1a; 一、定义分组接口 创建空的标…

vue3,Element Plus中隐藏树el-tree滚动条

el-tree&#xff0c;节点过多&#xff0c;默认会出现垂直滚动条&#xff0c;显得不美观 可以使用隐藏组件 el-scrollbar 将 el-tree 包裹&#xff0c;就可以隐藏垂直滚动条 <el-scrollbar> <el-tree> ... </el-tree> </el-scrollbar> /* 滚动条禁用鼠…

mysql练习

创建数据库db_ck&#xff0c;再创建表t_hero&#xff0c;将四大名著中的主要人物都插入这个表中&#xff0c;将实现过程中sql提交上上来 1、创建数据库db_ck mysql> create database db_ck; 2、创建表t_hero mysql> use db_ck Database changed mysql> create table …

svn删除所有隐藏.svn文件,文件夹脱离svn控制

新建一个文件&#xff0c;取名remove-svn-folders.reg&#xff0c;输入如下内容&#xff1a; Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…

文心一言:中国大模型时代的破局者与探路者

2023年&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的浪潮席卷全球&#xff0c;而百度推出的“文心一言”&#xff08;ERNIE Bot&#xff09;作为中国AI领域的代表性产品&#xff0c;迅速成为行业焦点。这款基于百度自主研发的“文心大模型”打造的对话式AI工具&am…

Ubuntu 安装docker docker-compose

Docker 通过提供轻量级、可移植且高效的解决方案&#xff0c;简化了软件开发和部署。“docker build”命令是 Docker 镜像创建过程的核心。本文将探讨 Docker 构建命令、用法以及 Docker 构建的优化。 Docker 构建有什么作用&#xff1f; Docker build 是一个命令行界面 CLI命…

Unity开发——CanvasGroup组件介绍和应用

CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染顺序的组件。 一、常用属性的解释 1、alpha&#xff1a;控制UI的透明度 类型&#xff1a;float&#xff0c;0.0 ~1.0&#xff0c; 其中 0.0 完全透明&#xff0c;1.0 完全不透明。 通过调整alpha值可以实现UI的淡入淡…

每天五分钟深度学习PyTorch:向更深的卷积神经网络挑战的ResNet

本文重点 ResNet大名鼎鼎,它是由何恺明团队设计的,它获取了2015年ImageNet冠军,它很好的解决了当神经网络层数过多出现的难以训练的问题,它创造性的设计了跳跃连接的方式,使得卷积神经网络的层数出现了大幅度提升,设置可以达到上千层,可以说resnet对于网络模型的设计具…

大模型巅峰对决:DeepSeek vs GPT-4/Claude/PaLM-2 全面对比与核心差异揭秘

文章目录 一、架构设计深度解剖1.1 核心架构对比图谱1.2 动态MoE架构实现架构差异分析表 二、训练策略全面对比2.1 训练数据工程对比2.2 分布式训练代码对比DeepSeek混合并行实现GPT-4 Megatron实现对比 2.3 关键训练参数对比 三、性能表现多维评测3.1 基准测试全景对比3.2 推理…

基于hive的电信离线用户的行为分析系统

标题:基于hive的电信离线用户的行为分析系统 内容:1.摘要 随着电信行业的快速发展&#xff0c;用户行为数据呈现出海量、复杂的特点。为了深入了解用户行为模式&#xff0c;提升电信服务质量和精准营销能力&#xff0c;本研究旨在构建基于 Hive 的电信离线用户行为分析系统。通…

Python使用alembic实现数据库管理

python使用alembic实现数据库管理 环境准备 安装依赖&#xff1a; pip install sqlalchemy alembic项目结构 my_project/ ├── models.py # 定义数据模型 └── alembic/ # 迁移脚本目录&#xff08;自动生成&#xff09; 使用步骤&#xff1a; 1. 初始化Alembic环境 …

对WebSocket做一点简单的理解

1.概念 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接 WebSocke…

kali虚拟机登录页面发癫 大写锁定输入不了密码

不知道怎么了 总是发癫 重启切换太麻烦了 还有时候不成功 kali其实可以开启虚拟键盘 如下 就解决的 发癫kali 发癫 发癫

基于Python的商品销量的数据分析及推荐系统

一、研究背景及意义 1.1 研究背景 随着电子商务的快速发展&#xff0c;商品销售数据呈现爆炸式增长。这些数据中蕴含着消费者行为、市场趋势、商品关联等有价值的信息。然而&#xff0c;传统的数据分析方法难以处理海量、多源的销售数据&#xff0c;无法满足现代电商的需求。…

内存泄漏出现的时机和原因,如何避免?

由于时间比较紧张我就不排版了&#xff0c;但是对于每一种可能的情况都会出对应的代码示例以及解决方案代码示例。 内存泄漏可能的原因之一在于用户在动态分配一个内存空间之中&#xff0c;忘记将这部分内容手动释放。例如&#xff1a;&#xff08;c之中使用new分配内存没有使…

PDF处理控件Aspose.PDF,如何实现企业级PDF处理

PDF处理为何成为开发者的“隐形雷区”&#xff1f; “手动调整200页PDF目录耗时3天&#xff0c;扫描件文字识别错误导致数据混乱&#xff0c;跨平台渲染格式崩坏引发客户投诉……” 作为开发者&#xff0c;你是否也在为PDF处理的复杂细节消耗大量精力&#xff1f;Aspose.PDF凭…

工程化与框架系列(27)--前端音视频处理

前端音视频处理 &#x1f3a5; 引言 前端音视频处理是现代Web应用中的重要组成部分&#xff0c;涉及音频播放、视频处理、流媒体传输等多个方面。本文将深入探讨前端音视频处理的关键技术和最佳实践&#xff0c;帮助开发者构建高质量的多媒体应用。 音视频技术概述 前端音视…