我正在嘗試add an additional button into a toolbar in Internet Explorer。爲什麼我的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, 0, (LPARAM)&buttonToAdd);
當發送消息時,Internet Explorer將崩潰90%的時間(10%的時候,我獲取工具欄上有點破損按鈕),但下列情況除外:
Unhandled exception at 0x000007FEFB97DDFA (comctl32.dll) in iexplore.exe: 0xC000041D: An unhandled exception was encountered during a user callback.
考慮的R結果不一致,我假設了某種內存佈局問題。所以我試圖發送TB_INSERTBUTTONA
而不是(我的應用程序默認爲TB_INSERTBUTTONW
),但是這對問題沒有影響。
我也試過我的應用程序的32和64版本,都有相同的結果。
我看了看在iexplore.exe
調用堆棧,它看起來像這樣:
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 int,unsigned __int64,__int64) Unknown
comctl32.dll!CToolbar::s_ToolbarWndProc(struct HWND__ *,unsigned int,unsigned __int64,__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
備註 - 這是嘗試打開黑盒Microsoft技術的一部分,以便任何人都可以輕鬆地免費創建IE擴展,而不必使用閉源專有技術。 –
請注意,IE可能決定在將來更改工具欄技術,或者它可能會更改其窗口層次結構,因此工具欄位於不同的位置。 (這兩種情況都發生在過去。)這段代碼依賴於IE的無證行爲,並且需要明確說明您的程序依賴於它,以便您的客戶知道他們在做什麼。 –
@RaymondChen你當然是對的。這是在SE的另一個問題上的開放技術努力,我們一次只能計算出一個IE版本(IE9-IE11可能是一個非常好的開始)。人們開發在IE上運行的擴展非常困難,這一事實令人驚訝。 –