4 * Copyright 2007 Robert Shearman
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
32 #include "wine/test.h"
34 static int droptarget_addref_called
;
35 static int droptarget_release_called
;
37 /* helper macros to make tests a bit leaner */
38 #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
40 static HRESULT WINAPI
DropTarget_QueryInterface(IDropTarget
* iface
, REFIID riid
,
43 trace("DropTarget_QueryInterface\n");
44 if (IsEqualIID(riid
, &IID_IUnknown
) ||
45 IsEqualIID(riid
, &IID_IDropTarget
))
47 IUnknown_AddRef(iface
);
55 static ULONG WINAPI
DropTarget_AddRef(IDropTarget
* iface
)
57 droptarget_addref_called
++;
61 static ULONG WINAPI
DropTarget_Release(IDropTarget
* iface
)
63 droptarget_release_called
++;
67 static HRESULT WINAPI
DropTarget_DragEnter(IDropTarget
* iface
,
68 IDataObject
* pDataObj
,
69 DWORD grfKeyState
, POINTL pt
,
75 static HRESULT WINAPI
DropTarget_DragOver(IDropTarget
* iface
,
83 static HRESULT WINAPI
DropTarget_DragLeave(IDropTarget
* iface
)
88 static HRESULT WINAPI
DropTarget_Drop(IDropTarget
* iface
,
89 IDataObject
* pDataObj
, DWORD grfKeyState
,
90 POINTL pt
, DWORD
* pdwEffect
)
95 static const IDropTargetVtbl DropTarget_VTbl
=
97 DropTarget_QueryInterface
,
100 DropTarget_DragEnter
,
102 DropTarget_DragLeave
,
106 static IDropTarget DropTarget
= { &DropTarget_VTbl
};
108 static ATOM
register_dummy_class(void)
116 GetModuleHandle(NULL
),
118 LoadCursor(NULL
, IDC_ARROW
),
119 (HBRUSH
)(COLOR_BTNFACE
+1),
121 TEXT("WineOleTestClass"),
124 return RegisterClass(&wc
);
132 hwnd
= CreateWindow(MAKEINTATOM(register_dummy_class()), "Test", 0,
133 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, NULL
,
136 hr
= RegisterDragDrop(hwnd
, &DropTarget
);
137 ok(hr
== E_OUTOFMEMORY
||
138 broken(hr
== CO_E_NOTINITIALIZED
), /* NT4 */
139 "RegisterDragDrop without OLE initialized should have returned E_OUTOFMEMORY instead of 0x%08x\n", hr
);
143 hr
= RegisterDragDrop(hwnd
, NULL
);
144 ok(hr
== E_INVALIDARG
, "RegisterDragDrop with NULL IDropTarget * should return E_INVALIDARG instead of 0x%08x\n", hr
);
146 hr
= RegisterDragDrop(NULL
, &DropTarget
);
147 ok(hr
== DRAGDROP_E_INVALIDHWND
, "RegisterDragDrop with NULL hwnd should return DRAGDROP_E_INVALIDHWND instead of 0x%08x\n", hr
);
149 hr
= RegisterDragDrop((HWND
)0xdeadbeef, &DropTarget
);
150 ok(hr
== DRAGDROP_E_INVALIDHWND
, "RegisterDragDrop with garbage hwnd should return DRAGDROP_E_INVALIDHWND instead of 0x%08x\n", hr
);
152 ok(droptarget_addref_called
== 0, "DropTarget_AddRef shouldn't have been called\n");
153 hr
= RegisterDragDrop(hwnd
, &DropTarget
);
154 ok_ole_success(hr
, "RegisterDragDrop");
155 ok(droptarget_addref_called
== 1, "DropTarget_AddRef should have been called once, not %d times\n", droptarget_addref_called
);
157 hr
= RegisterDragDrop(hwnd
, &DropTarget
);
158 ok(hr
== DRAGDROP_E_ALREADYREGISTERED
, "RegisterDragDrop with already registered hwnd should return DRAGDROP_E_ALREADYREGISTERED instead of 0x%08x\n", hr
);
160 ok(droptarget_release_called
== 0, "DropTarget_Release shouldn't have been called\n");
162 ok(droptarget_release_called
== 0, "DropTarget_Release shouldn't have been called\n");
164 hr
= RevokeDragDrop(hwnd
);
165 ok_ole_success(hr
, "RevokeDragDrop");
166 ok(droptarget_release_called
== 1 ||
167 broken(droptarget_release_called
== 0), /* NT4 */
168 "DropTarget_Release should have been called once, not %d times\n", droptarget_release_called
);
170 hr
= RevokeDragDrop(NULL
);
171 ok(hr
== DRAGDROP_E_INVALIDHWND
, "RevokeDragDrop with NULL hwnd should return DRAGDROP_E_INVALIDHWND instead of 0x%08x\n", hr
);