Al een paar uur zit ik te stoeien met het embedden van een ActiveX-control (namelijk Shell.Explorer.2, de Internet Explorer control, en later misschien die van Mozilla). Het duurde me al twee uur om uit te vinden dat 'AtlAxWin' veranderd is in 'AtlAxWin80', maargoed
Ik gebruik dus onderstaand stukje code om zo'n control te maken:
Ik krijg netjes een HWND terug naar een AtlAxWin80 window in mijn eigen window. Het vreemde is echter dat de browser zelf, volgens Spy++ een window met class 'Shell Embedding', verschijnt in de linkerbovenhoek van mijn scherm en geen child is van de AtlAxWin80 of mijn eigen window... hoe los ik dit op?
Ik weet niet of het uitmaakt: AtlAxWinInit wordt netjes aangeroepen en werkt prima, de code bevindt zich in een DLL, maar doet in DllMain netjes de CComModule initialiseren. De superclass van BrowserWnd doet een CreateWindow en de HWND daarvan wordt in _wnd gezet, die ik dus als parent class voor de AtlAxWin80 gebruik.
Ook vreemd: met MSCAL.Calendar als class en bijvoorbeeld de mozilla CLSID krijg ik van GetLastError een 1400 ('invalid window handle')... zit toch ergens iets niet lekker in ATL?
Nog wat extra info: zelfs met CAxWindow (de ATL wrapper om AtlAxWin heen) werkt het niet goed. Hier een screenshot:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
| BrowserWnd::BrowserWnd(HWND parent): ChildWnd(L"", parent, true, false) { SetStyle(WS_CLIPCHILDREN); Layout(); HINSTANCE inst = (HINSTANCE)GetWindowLong(_wnd, GWL_HINSTANCE); _bwnd = CreateWindowEx(0L, L"AtlAxWin80", L"Shell.Explorer.2", WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, 0, 0, 100, 100, _wnd, 0L, inst,0 ); int e = GetLastError(); if(_bwnd==0) { Log::Write(L"Browser/Wnd", L"failed: "+Stringify(e)); } } |
Ik krijg netjes een HWND terug naar een AtlAxWin80 window in mijn eigen window. Het vreemde is echter dat de browser zelf, volgens Spy++ een window met class 'Shell Embedding', verschijnt in de linkerbovenhoek van mijn scherm en geen child is van de AtlAxWin80 of mijn eigen window... hoe los ik dit op?
Ik weet niet of het uitmaakt: AtlAxWinInit wordt netjes aangeroepen en werkt prima, de code bevindt zich in een DLL, maar doet in DllMain netjes de CComModule initialiseren. De superclass van BrowserWnd doet een CreateWindow en de HWND daarvan wordt in _wnd gezet, die ik dus als parent class voor de AtlAxWin80 gebruik.
Ook vreemd: met MSCAL.Calendar als class en bijvoorbeeld de mozilla CLSID krijg ik van GetLastError een 1400 ('invalid window handle')... zit toch ergens iets niet lekker in ATL?
Nog wat extra info: zelfs met CAxWindow (de ATL wrapper om AtlAxWin heen) werkt het niet goed. Hier een screenshot:
[ Voor 9% gewijzigd door MisterData op 15-08-2006 18:11 ]