大佬教程收集整理的这篇文章主要介绍了c – 为什么我的TB_INSERTBUTTON消息导致comctl32抛出?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
TBBUTTON buttontoadd; ZeroMemory( &buttontoadd,sizeof( TBBUTTON ) ); buttontoadd.iBitmap = 1; buttontoadd.idCommand = 1; buttontoadd.fsState = TBSTATE_ENABLED; buttontoadd.fsStyle = BTNS_BUTTON|BTNS_AUTOSIZE; LRESULT insertButtonResult = Sendmessage( hWndToolbar,TB_INSERTBUTTON,(LPARAM)&buttontoadd );
当邮件发送时,Internet Explorer将在90%的时间内崩溃(10%的时间,工具栏上的按钮有点坏),但有以下例外:
鉴于结果不一致,我假设某种内存布局问题.所以我试图发送TB_INSERTBUTTONA(我的应用程序默认为TB_INSERTBUTTONW),但这对该问题没有影响.
我也试过我的应用程序的32和64版本,都具有相同的结果.
我看了看iexplore.exe的callstack,看起来像这样:
comctl32.dll!CToolbar::TBInputStruct(struct _TBBUTTONDATA *,struct _TBBUTTON const *) UnkNown comctl32.dll!CToolbar::TBInsertButtons(unsigned int,unsigned int,struct _TBBUTTON *,int) UnkNown comctl32.dll!CToolbar::ToolbarWndProc(struct HWND__ *,unsigned __int64,__int64) UnkNown comctl32.dll!CToolbar::s_ToolbarWndProc(struct HWND__ *,__int64) UnkNown user32.dll!UserCallWinProccheckWow() UnkNown user32.dll!DispatchClientmessage() UnkNown user32.dll!__fnDWORD() UnkNown ntdll.dll!KiUserCallBACkDispatcherConTinue() UnkNown user32.dll!NtUserPeekmessage() UnkNown user32.dll!PeekmessageW() UnkNown ...
我发现有点有趣,因为我假设顶部的方法将数据从我的输入结构复制到一个内部结构中,而且出了问题.但是我的输入数据结构有什么问题?
源代码本身可在GitHub上获得:https://github.com/oliversalzburg/ie-button
LRESULT insertButtonResult = Sendmessage(hWndToolbar,(LPARAM)&buttontoadd);
最后一个参数是进程地址空间中的一个地址.但收件人是一个不同的进程,而您通过的地址在其他进程的地址空间中没有意义.
一些消息,例如WM_SETTEXT,将使其有效负载由系统编组到另一个进程.但TB_INSERTBUTTON不属于该类别. TB_INSERTBUTTON的一个规则是你传递的指针在拥有收件人窗口的进程中有意义.
您可以通过使用VirtualAlloc,WriteProcessMemory等来解决这个问题,以在其他进程中分配和写入内存.
要警告,这是一个有点困难的任务.无论两个过程是否具有相同的位,特别重要的是重要.结构的布局在32位和64位之间不同.确保发送正确布局的最简单方法是以与目标进程相同的位置来编译进程.
到目前为止,最简单的做这样的方法是在目标过程之内.如果您要编写一个插件,那么您不必处理任何这些问题,也可以使用正式支持的API进行扩展.
正如雷蒙德所说,你所尝试的是相当危险的,你会很好地听从他的建议.
以上是大佬教程为你收集整理的c – 为什么我的TB_INSERTBUTTON消息导致comctl32抛出?全部内容,希望文章能够帮你解决c – 为什么我的TB_INSERTBUTTON消息导致comctl32抛出?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。