From e01794d4f7b3097b51d558452618f04175f672fc Mon Sep 17 00:00:00 2001 From: Andrew Nguyen Date: Tue, 29 Jun 2010 09:06:35 -0500 Subject: [PATCH] atl: Accept a NULL output container pointer in AtlAxAttachControl. --- dlls/atl/atl_ax.c | 5 +- dlls/atl/tests/Makefile.in | 3 +- dlls/atl/tests/atl_ax.c | 122 +++++++++++++++++++++++++++++++++++++ dlls/atl/tests/module.c | 1 - 4 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 dlls/atl/tests/atl_ax.c diff --git a/dlls/atl/atl_ax.c b/dlls/atl/atl_ax.c index cf654e13d66..d9d60a56b9e 100644 --- a/dlls/atl/atl_ax.c +++ b/dlls/atl/atl_ax.c @@ -1044,10 +1044,11 @@ HRESULT WINAPI AtlAxAttachControl(IUnknown* pControl, HWND hWnd, IUnknown** ppUn TRACE( "%p %p %p\n", pControl, hWnd, ppUnkContainer ); - *ppUnkContainer = NULL; + if (!pControl) + return E_INVALIDARG; hr = IOCS_Create( hWnd, pControl, &pUnkContainer ); - if ( SUCCEEDED( hr ) ) + if ( SUCCEEDED( hr ) && ppUnkContainer) { *ppUnkContainer = (IUnknown*) pUnkContainer; } diff --git a/dlls/atl/tests/Makefile.in b/dlls/atl/tests/Makefile.in index b9752d46ad2..98d9b03342b 100644 --- a/dlls/atl/tests/Makefile.in +++ b/dlls/atl/tests/Makefile.in @@ -3,9 +3,10 @@ TOPOBJDIR = ../../.. SRCDIR = @srcdir@ VPATH = @srcdir@ TESTDLL = atl.dll -IMPORTS = atl oleaut32 ole32 rpcrt4 user32 gdi32 advapi32 kernel32 +IMPORTS = uuid atl oleaut32 ole32 rpcrt4 user32 gdi32 advapi32 kernel32 C_SRCS = \ + atl_ax.c \ module.c @MAKE_TEST_RULES@ diff --git a/dlls/atl/tests/atl_ax.c b/dlls/atl/tests/atl_ax.c new file mode 100644 index 00000000000..8b9966c26df --- /dev/null +++ b/dlls/atl/tests/atl_ax.c @@ -0,0 +1,122 @@ +/* + * Unit tests for Active Template Library ActiveX functions + * + * Copyright 2010 Andrew Nguyen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include + +#define COBJMACROS + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +HRESULT WINAPI AtlAxAttachControl(IUnknown *, HWND, IUnknown **); + +static ATOM register_class(void) +{ + WNDCLASSA wndclassA; + + wndclassA.style = 0; + wndclassA.lpfnWndProc = DefWindowProc; + wndclassA.cbClsExtra = 0; + wndclassA.cbWndExtra = 0; + wndclassA.hInstance = GetModuleHandleA(NULL); + wndclassA.hIcon = NULL; + wndclassA.hCursor = LoadCursorA(NULL, IDC_ARROW); + wndclassA.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); + wndclassA.lpszMenuName = NULL; + wndclassA.lpszClassName = "WineAtlTestClass"; + + return RegisterClassA(&wndclassA); +} + +static void test_AtlAxAttachControl(void) +{ + HWND hwnd = CreateWindowA("WineAtlTestClass", "Wine ATL Test Window", 0, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, NULL, NULL, NULL, NULL); + HRESULT hr; + IUnknown *pObj, *pContainer; + + hr = AtlAxAttachControl(NULL, NULL, NULL); + ok(hr == E_INVALIDARG, "Expected AtlAxAttachControl to return E_INVALIDARG, got 0x%08x\n", hr); + + pContainer = (IUnknown *)0xdeadbeef; + hr = AtlAxAttachControl(NULL, NULL, &pContainer); + ok(hr == E_INVALIDARG, "Expected AtlAxAttachControl to return E_INVALIDARG, got 0x%08x\n", hr); + ok(pContainer == (IUnknown *)0xdeadbeef, + "Expected the output container pointer to be untouched, got %p\n", pContainer); + + hr = AtlAxAttachControl(NULL, hwnd, NULL); + ok(hr == E_INVALIDARG, "Expected AtlAxAttachControl to return E_INVALIDARG, got 0x%08x\n", hr); + + hr = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, + &IID_IOleObject, (void **)&pObj); + 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(pObj, NULL, NULL); + todo_wine + ok(hr == S_FALSE, "Expected AtlAxAttachControl to return S_FALSE, got 0x%08x\n", hr); + + pContainer = (IUnknown *)0xdeadbeef; + hr = AtlAxAttachControl(pObj, NULL, &pContainer); + todo_wine + ok(hr == S_FALSE, "Expected AtlAxAttachControl to return S_FALSE, got 0x%08x\n", hr); + ok(pContainer != (IUnknown *)0xdeadbeef && + pContainer != NULL, + "Expected the output container pointer to be initialized to non-NULL, got %p\n", pContainer); + + if (pContainer != (IUnknown *)0xdeadbeef && pContainer != NULL) + IUnknown_Release(pContainer); + + hr = AtlAxAttachControl(pObj, hwnd, NULL); + ok(hr == S_OK, "Expected AtlAxAttachControl to return S_OK, got 0x%08x\n", hr); + + IUnknown_Release(pObj); + + DestroyWindow(hwnd); +} + +START_TEST(atl_ax) +{ + if (!register_class()) + return; + + CoInitialize(NULL); + + test_AtlAxAttachControl(); + + CoUninitialize(); +} diff --git a/dlls/atl/tests/module.c b/dlls/atl/tests/module.c index 294d87b8629..1b21f6e714c 100644 --- a/dlls/atl/tests/module.c +++ b/dlls/atl/tests/module.c @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include