Win7 x64下Tab Control插入标签问题
2013-10-09 23:32
267 查看
最近想用汇编(JWASM)写一64位的程序,没想到在创建Tab上遇到了问题,在WndProc函数里处理WM_CREATE时,用CreateWindowEX创建Tab控件后,调用SendMessage发送TCM_INSERTITEM消息时莫名其妙的报0xc000005错误
@tie为TCITEM Struct
仔细查看了代码,没发现错误,而运行时却报0xc000005错误
用WinDbg调试了下,发现最后出错在Kernel32.dll的lstrcpy函数上,有点不明白,查看了下Call Stack,发现问题主要出在comctl32.dll的Tab_OnInsertItem函数上,其通过comctl32.dll的Str_Set函数调用lstrcpy,Tab_OnInsertItem函数内容见下图
在第8行里,mov rbp,r8 (将@tie地址赋予了rbp),而在此后第23、31、39行对@tie.imask值进行比较,而我之前将TCIF_TEXT(0x1)赋予@tie.imask,
所以第39行
test byte ptr [rbp],1 ;; if ( @tie.imask == 1)
对比正确后开始执行第41行,
mov rdx,
qword ptr [rbp+10h] ;;将TCITEM.pszText的值赋予rdx
紧接着在第43行就调用函数Str_Set了,可以看出函数Str_Set的第二个参数为@tie.pszText
错就出在第41行mov rdx,qword ptr [rbp+10h]的[rbp+10h]上,
按MSDN上对TCITEM的定义
@tie.pszText的地址应该为[rbp+0ch](rbp为@tie的指针),而实际在comctl32.dll的Tab_OnInsertItem函数中取pszText的地址为[rbp+10h],也就是说TCITEM
struct中在pszText之前应该有16个字节,这个不知道算不算Bug?还是微软忘了在MSDN上更新TCITEM,所以我暂时将TCITEM.mask的值类型改为UINT64(因TCM_INSERTITEM消息中dwState和dwStateMask为无效),就成了
这样@tie.pszText的地址就成了[rbp+10h]
重新对ASM文件进行编译后,程序终于正常运行了
不清楚微软在comctl32.dll中怎么定义的TCITEM……
另:看CSDN上好多人问为什么无法读取Tab上的文字(C++),按其贴出的代码来看是正确的,不知道他们是否也是在写64位程序,因TCITEM Struct问题所以无法得到正确的TCITEM.pszText地址
@tie为TCITEM Struct
仔细查看了代码,没发现错误,而运行时却报0xc000005错误
用WinDbg调试了下,发现最后出错在Kernel32.dll的lstrcpy函数上,有点不明白,查看了下Call Stack,发现问题主要出在comctl32.dll的Tab_OnInsertItem函数上,其通过comctl32.dll的Str_Set函数调用lstrcpy,Tab_OnInsertItem函数内容见下图
在第8行里,mov rbp,r8 (将@tie地址赋予了rbp),而在此后第23、31、39行对@tie.imask值进行比较,而我之前将TCIF_TEXT(0x1)赋予@tie.imask,
所以第39行
test byte ptr [rbp],1 ;; if ( @tie.imask == 1)
对比正确后开始执行第41行,
mov rdx,
qword ptr [rbp+10h] ;;将TCITEM.pszText的值赋予rdx
紧接着在第43行就调用函数Str_Set了,可以看出函数Str_Set的第二个参数为@tie.pszText
错就出在第41行mov rdx,qword ptr [rbp+10h]的[rbp+10h]上,
按MSDN上对TCITEM的定义
typedef struct tagTCITEM { UINT mask; 4个字节 (因mask为JWASM的关键字,所以更改为imask) DWORD dwState; 4个字节 DWORD dwStateMask; 4个字节 LPTSTR pszText; 8个字节 int cchTextMax ; 4个字节 int iImage; 4个字节 LPARAM lParam; 8个字节 } TCITEM;
@tie.pszText的地址应该为[rbp+0ch](rbp为@tie的指针),而实际在comctl32.dll的Tab_OnInsertItem函数中取pszText的地址为[rbp+10h],也就是说TCITEM
struct中在pszText之前应该有16个字节,这个不知道算不算Bug?还是微软忘了在MSDN上更新TCITEM,所以我暂时将TCITEM.mask的值类型改为UINT64(因TCM_INSERTITEM消息中dwState和dwStateMask为无效),就成了
typedef struct tagTCITEM { UINT64 mask; 8个字节 DWORD dwState; 4个字节 DWORD dwStateMask; 4个字节 LPTSTR pszText; 8个字节 int cchTextMax ; 4个字节 int iImage; 4个字节 LPARAM lParam; 8个字节 } TCITEM;
这样@tie.pszText的地址就成了[rbp+10h]
重新对ASM文件进行编译后,程序终于正常运行了
不清楚微软在comctl32.dll中怎么定义的TCITEM……
另:看CSDN上好多人问为什么无法读取Tab上的文字(C++),按其贴出的代码来看是正确的,不知道他们是否也是在写64位程序,因TCITEM Struct问题所以无法得到正确的TCITEM.pszText地址
相关文章推荐
- 关于TabControl标签颜色改变的问题
- 【WPF收藏】隐藏TabControl标签(按钮)的方法(Hide the TabStrip of a TabControl)
- win7 X64或x86安装mySQL,服务无法启动问题的解决
- C#中关于WinForm中重绘TabControl选项卡标题的问题
- 标签控件TabControl的使用
- DataForm中包含TabControl控件,FindNameInContent方法无法获取未选中TabItem里的控件问题
- 子窗口最大化后在父窗口中以TabControl中显示的问题
- MFC入门学习之控件(3)标签控件Tab Control的添加和使用
- c# winform 隐藏tabcontrol标签
- From Dr.WPF 的Tabcontrol的MVVM性能问题
- 解决Win7 x64版支付宝证书导入问题
- tab control控件 vc++ 6.0 移植到VS2008 出现的问题(初学VC++的可以看看,)
- Winform 自定义TabControl实现浏览器标签
- TOAD在Win7 X64系统上使用遇到的问题
- win7 x64 下VC6的调试程序无法退出的问题
- tdm在win7 x64下静态编译 QT5.5 64bit版本问题1
- win7 x64驱动开发经验(三)windbg 双机调试配置 、问题及解决办法
- Orcale(一)----WIN7 X64下安装ORACLE 10g(检查操作系统版本: 6.1a等问题)
- 关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
- # 【ARM-Linux开发】在Win7的电脑上直接运行安装Ubuntu14.04发生的问题 标签(空格分隔): 【Linux开发】 --- > 一段时间以来,一直是在Windows上安装虚拟机