bool DxFlashViewer::Init( IDirect3DDevice9* pDevice, HWND hWnd, int width, int height ) { if (NULL == pDevice || width <= 0 || height <= 0) return false; this->mDevice = pDevice; this->mViewerWidth = width; this->mViewerHeight = height; // calculate texture size required (next power of two above browser window size) for ( mTextureWidth = 1; mTextureWidth < mViewerWidth; mTextureWidth <<= 1 ); for ( mTextureHeight = 1; mTextureHeight < mViewerHeight; mTextureHeight <<= 1 ); // create the browser window in the background WNDCLASSEX wc; ZeroMemory(&wc, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = DefWindowProc; wc.lpszClassName = "FlashViewer"; RegisterClassEx(&wc); this->mViewerWnd = CreateWindowEx(0, "FlashViewer", "FlashViewer", WS_POPUP , 0, 0, width, height, hWnd, NULL, NULL, 0); if (!this->mViewerWnd) return false; //embed the player in the window HRESULT hr; hr = CoCreateInstance(__uuidof(ShockwaveFlash), 0, CLSCTX_ALL, __uuidof(IShockwaveFlash), (void **)&(this->mFlashCtrl)); if (FAILED(hr)) return false; hr = this->mFlashCtrl->put_WMode(L"transparent"); hr = AtlAxAttachControl(this->mFlashCtrl, this->mViewerWnd, NULL); if (FAILED(hr)) return false; hr = this->mFlashCtrl->QueryInterface(__uuidof(IOleInPlaceObjectWindowless), (void**)&this->mWndlessObject); if (FAILED(hr)) return false; // create the render texture for Direct3D hr = this->mDevice->CreateTexture(this->mTextureWidth, this->mTextureHeight , 0, NULL, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &this->mTexture, NULL); if (FAILED(hr)) return false; return true; }
/*********************************************************************** * AtlAxCreateControlEx [atl100.@] * * REMARKS * See http://www.codeproject.com/com/cwebpage.asp for some background * */ HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, IStream *pStream, IUnknown **ppUnkContainer, IUnknown **ppUnkControl, REFIID iidSink, IUnknown *punkSink) { CLSID controlId; HRESULT hRes; IOleObject *pControl; IUnknown *pUnkControl; IPersistStreamInit *pPSInit; IUnknown *pContainer; enum {IsGUID=0,IsHTML=1,IsURL=2} content; TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream, ppUnkContainer, ppUnkControl, iidSink, punkSink); hRes = CLSIDFromString( lpszName, &controlId ); if ( FAILED(hRes) ) hRes = CLSIDFromProgID( lpszName, &controlId ); if ( SUCCEEDED( hRes ) ) content = IsGUID; else { /* FIXME - check for MSHTML: prefix! */ content = IsURL; controlId = CLSID_WebBrowser; } hRes = CoCreateInstance( &controlId, 0, CLSCTX_ALL, &IID_IOleObject, (void**) &pControl ); if ( FAILED( hRes ) ) { WARN( "cannot create ActiveX control %s instance - error 0x%08x\n", debugstr_guid( &controlId ), hRes ); return hRes; } hRes = IOleObject_QueryInterface( pControl, &IID_IPersistStreamInit, (void**) &pPSInit ); if ( SUCCEEDED( hRes ) ) { if (!pStream) IPersistStreamInit_InitNew( pPSInit ); else IPersistStreamInit_Load( pPSInit, pStream ); IPersistStreamInit_Release( pPSInit ); } else WARN("cannot get IID_IPersistStreamInit out of control\n"); IOleObject_QueryInterface( pControl, &IID_IUnknown, (void**) &pUnkControl ); IOleObject_Release( pControl ); hRes = AtlAxAttachControl( pUnkControl, hWnd, &pContainer ); if ( FAILED( hRes ) ) WARN("cannot attach control to window\n"); if ( content == IsURL ) { IWebBrowser2 *browser; hRes = IOleObject_QueryInterface( pControl, &IID_IWebBrowser2, (void**) &browser ); if ( !browser ) WARN( "Cannot query IWebBrowser2 interface: %08x\n", hRes ); else { VARIANT url; IWebBrowser2_put_Visible( browser, VARIANT_TRUE ); /* it seems that native does this on URL (but do not on MSHTML:! why? */ V_VT(&url) = VT_BSTR; V_BSTR(&url) = SysAllocString( lpszName ); hRes = IWebBrowser2_Navigate2( browser, &url, NULL, NULL, NULL, NULL ); if ( FAILED( hRes ) ) WARN( "IWebBrowser2::Navigate2 failed: %08x\n", hRes ); SysFreeString( V_BSTR(&url) ); IWebBrowser2_Release( browser ); } } if (ppUnkContainer) { *ppUnkContainer = pContainer; if ( pContainer ) IUnknown_AddRef( pContainer ); } if (ppUnkControl) { *ppUnkControl = pUnkControl; if ( pUnkControl ) IUnknown_AddRef( pUnkControl ); } if ( pUnkControl ) IUnknown_Release( pUnkControl ); if ( pContainer ) IUnknown_Release( pContainer ); return S_OK; }
static void test_AtlAxAttachControl(void) { HWND hwnd; HRESULT hr; IUnknown *control, *container; LONG val; hr = AtlAxAttachControl(NULL, NULL, NULL); ok(hr == E_INVALIDARG, "Expected AtlAxAttachControl to return E_INVALIDARG, got 0x%08x\n", hr); container = (IUnknown *)0xdeadbeef; hr = AtlAxAttachControl(NULL, NULL, &container); ok(hr == E_INVALIDARG, "Expected AtlAxAttachControl to return E_INVALIDARG, got 0x%08x\n", hr); ok(container == (IUnknown *)0xdeadbeef, "Expected the output container pointer to be untouched, got %p\n", container); hwnd = create_container_window(); hr = AtlAxAttachControl(NULL, hwnd, NULL); ok(hr == E_INVALIDARG, "Expected AtlAxAttachControl to return E_INVALIDARG, got 0x%08x\n", hr); DestroyWindow(hwnd); hwnd = create_container_window(); container = (IUnknown *)0xdeadbeef; hr = AtlAxAttachControl(NULL, hwnd, &container); ok(hr == E_INVALIDARG, "Expected AtlAxAttachControl to return E_INVALIDARG, got 0x%08x\n", hr); ok(container == (IUnknown *)0xdeadbeef, "returned %p\n", container); DestroyWindow(hwnd); hr = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, &IID_IOleObject, (void **)&control); ok(hr == S_OK, "Expected CoCreateInstance to return S_OK, got 0x%08x\n", hr); if (FAILED(hr)) { skip("Couldn't obtain a test IOleObject instance\n"); return; } hr = AtlAxAttachControl(control, NULL, NULL); ok(hr == S_FALSE, "Expected AtlAxAttachControl to return S_FALSE, got 0x%08x\n", hr); container = NULL; hr = AtlAxAttachControl(control, NULL, &container); ok(hr == S_FALSE, "Expected AtlAxAttachControl to return S_FALSE, got 0x%08x\n", hr); ok(container != NULL, "got %p\n", container); IUnknown_Release(container); hwnd = create_container_window(); SetWindowLongW(hwnd, GWLP_USERDATA, 0xdeadbeef); hr = AtlAxAttachControl(control, hwnd, NULL); ok(hr == S_OK, "Expected AtlAxAttachControl to return S_OK, got 0x%08x\n", hr); val = GetWindowLongW(hwnd, GWLP_USERDATA); ok(val == 0xdeadbeef, "returned %08x\n", val); DestroyWindow(hwnd); hwnd = create_container_window(); SetWindowLongW(hwnd, GWLP_USERDATA, 0xdeadbeef); container = NULL; hr = AtlAxAttachControl(control, hwnd, &container); ok(hr == S_OK, "Expected AtlAxAttachControl to return S_OK, got 0x%08x\n", hr); ok(container != NULL, "Expected not NULL!\n"); IUnknown_Release(container); val = GetWindowLongW(hwnd, GWLP_USERDATA); ok(val == 0xdeadbeef, "Expected unchanged, returned %08x\n", val); DestroyWindow(hwnd); IUnknown_Release(control); }