masm汇编。treeview的HTREEVIEW问题。

时间:2022-11-13 01:14:54
我想创建一个树Treeview。用SendDlgItemMessage给树窗口发消息TVM_INSERTITEM创建了一个根节点。然后应该返回一个HTREEVIEW的类型句柄在寄存器eax中吧。
事实的确是这样的,我用eax中的值作为父节点的句柄可以创建子节点。
但是如果我用mov hParent,eax之后,再用hParent(dw型)无法创建子节点。会提示 invalid struction operands.  
但我查了一些资料都说HTREEVIEW是dw类型。不得其解。

部分源码
.data
hParent  dd   ?
……
invoke SendDlgItemMessage,hWnd,TVW,TVM_INSERTITEM,0,addr tvinsert 
mov hParent, eax 
mov tvinsert.hParent, hParent  (如果是 ‘mov tvinsert.hParent, eax’ 就可以)
……

9 个解决方案

#1


HTREEITEM TreeView_InsertItem(
    HWND hwndTV,
    LPTVINSERTSTRUCT lpis
);

#2


编译为 32 位程序的话用 dd,64 位程序用 dq。

#3


据我网上搜索 dw 实际上是 WORD 类型也就是 unsigned short,用这个存储句柄……

#4


引用 3 楼 贾可的回复:
据我网上搜索 dw 实际上是 WORD 类型也就是 unsigned short,用这个存储句柄……

我用dd定义的。想表达这是dword类型。没表述清楚。

#5


 dw 实际上是 define  WORD
dd  实际上是  define  double WORD

#6


引用 5 楼 schlafenhamster的回复:
 dw 实际上是 define  WORD
dd  实际上是  define  double WORD

没错吧。我用dd定义hParent来当做句柄,就是double word类型啊。   问题里面的dw指的是double word,是我没用对词。

#7


mov tvinsert.hParent, hParent 
这是一条 内存 到 内存 的 操作 , 不可以 吧

#8


mov tvinsert.hParent, hParent 

要求 2个 变量的 地址 , cpu 地址总线 只能 发一个变量的地址, 所以 2个 内存变量 不能在一条指令 中处理。
这就是  DMA (direct memory access)的 作用

#9


引用 8 楼 schlafenhamster的回复:
mov tvinsert.hParent, hParent 

要求 2个 变量的 地址 , cpu 地址总线 只能 发一个变量的地址, 所以 2个 内存变量 不能在一条指令 中处理。
这就是  DMA (direct memory access)的 作用

你是对的,用offset就可以了。我基础不扎实。

#1


HTREEITEM TreeView_InsertItem(
    HWND hwndTV,
    LPTVINSERTSTRUCT lpis
);

#2


编译为 32 位程序的话用 dd,64 位程序用 dq。

#3


据我网上搜索 dw 实际上是 WORD 类型也就是 unsigned short,用这个存储句柄……

#4


引用 3 楼 贾可的回复:
据我网上搜索 dw 实际上是 WORD 类型也就是 unsigned short,用这个存储句柄……

我用dd定义的。想表达这是dword类型。没表述清楚。

#5


 dw 实际上是 define  WORD
dd  实际上是  define  double WORD

#6


引用 5 楼 schlafenhamster的回复:
 dw 实际上是 define  WORD
dd  实际上是  define  double WORD

没错吧。我用dd定义hParent来当做句柄,就是double word类型啊。   问题里面的dw指的是double word,是我没用对词。

#7


mov tvinsert.hParent, hParent 
这是一条 内存 到 内存 的 操作 , 不可以 吧

#8


mov tvinsert.hParent, hParent 

要求 2个 变量的 地址 , cpu 地址总线 只能 发一个变量的地址, 所以 2个 内存变量 不能在一条指令 中处理。
这就是  DMA (direct memory access)的 作用

#9


引用 8 楼 schlafenhamster的回复:
mov tvinsert.hParent, hParent 

要求 2个 变量的 地址 , cpu 地址总线 只能 发一个变量的地址, 所以 2个 内存变量 不能在一条指令 中处理。
这就是  DMA (direct memory access)的 作用

你是对的,用offset就可以了。我基础不扎实。