AtlAxWin host crashes for some ActiveX classes
I'm playing with AtlAxWin and trying to use it to build a simple ActiveX
class browser. I find that AtlAxWin hits an exception for some classes when
is tries to do the OLEIVERB_INPLACEACTIVATE verb. For example, when I try
to create an instance of the Shockwave ActiveX control.
Is ATL supposed to be robust enough to use in a class browser where a user
may select any installed class? If so, can anyone spot what I'm doing
wrong?
Thanks a lot.
David Liebtag
PS. Here's my test bed program that reproduces the problem for me:
#include <windows.h>
#pragma comment(lib, "atl.lib")
#include <atlbase.h>
#include <atldef.h>
#include <atlhost.h>
#include <atlwin.h>
#include <initguid.h>
#define APP "My Class"
#define IDC_MYCTL 35
LRESULT CALLBACK MyWindowProc(HWND,UINT,WPARAM,LPARAM);
class CDummyModule : public CAtlExeModuleT<CDummyModule> {
public:
DECLARE_LIBID(LIBID_ATLLib);
};
CDummyModule _Module;
HWND hWndX ;
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,PSTR sxCommand,int
iShow)
{
INITCOMMONCONTROLSEX CommonControls ;
CommonControls.dwSize = sizeof(INITCOMMONCONTROLSEX) ;
CommonControls.dwICC = ICC_DATE_CLASSES ;
InitCommonControlsEx(&CommonControls) ;
CoInitialize(0);
AtlAxWinInit();
WNDCLASSEX myWindow;
myWindow.cbClsExtra = 0;
myWindow.cbSize = sizeof(myWindow);
myWindow.cbWndExtra = 0;
myWindow.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
myWindow.hCursor = LoadCursor(NULL,IDC_ARROW);
myWindow.hIcon = LoadIcon(NULL,IDI_APPLICATION);
myWindow.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
myWindow.hInstance = hInst;
myWindow.lpfnWndProc = MyWindowProc;
myWindow.lpszClassName = APP;
myWindow.lpszMenuName = NULL;
myWindow.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx(&myWindow);
HWND hWnd;
hWnd = CreateWindow(APP,"AtlAxWin Test",WS_OVERLAPPEDWINDOW,0,0,640,480,
NULL,NULL,hInst,NULL);
if(hWnd)
{
CAxWindow wnd;
RECT rect = {10,10,400,300};
//*hWndX = CreateWindow("AtlAxWin71","http://www.ibm.com"
,WS_CHILD|WS_VISIBLE ,0,0,50,50 ,hWnd,NULL,hInst,NULL );
//*hWndX = CreateWindow("AtlAxWin71","MSComCtl2.MonthView.2"
,WS_CHILD|WS_VISIBLE ,0,0,50,50 ,hWnd,NULL,hInst,NULL );
hWndX = CreateWindow("AtlAxWin71","SWCtl.SWCtl.10.1.1"
,WS_CHILD|WS_VISIBLE ,0,0,50,50 ,hWnd,NULL,hInst,NULL );
//* SWCtl.SWCtl.10.1.1
//* Shockwave ActiveX Control
//* {233C1507-6A77-46A4-9443-F871F945D258} 1 1 0
if(hWndX == 0)
{
char Message[1024] ;
sprintf(Message,"CreateWindow AtlAxWin failed. Last error:
%li",GetLastError()) ;
MessageBox(hWnd,Message,"AtlTest Message",MB_OK) ;
}
else
{
ShowWindow(hWnd, iShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
AtlAxWinTerm();
CoUninitialize() ;
return 0 ;
}
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
switch(msg)
{
case WM_CREATE:
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
return 0;
}
case WM_SIZE:
{
RECT clientRect;
GetClientRect(hWnd, &clientRect);
SetWindowPos(hWndX,HWND_TOP,0,0,clientRect.right,clientRect.bottom,SWP_NOZORDER);
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}