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 /* functions that are not present on all versions of Windows */
35 HRESULT (WINAPI
* pCoInitializeEx
)(LPVOID lpReserved
, DWORD dwCoInit
);
37 static int droptarget_addref_called
;
38 static int droptarget_release_called
;
40 /* helper macros to make tests a bit leaner */
41 #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
43 static HRESULT WINAPI
DropTarget_QueryInterface(IDropTarget
* iface
, REFIID riid
,
46 trace("DropTarget_QueryInterface\n");
47 if (IsEqualIID(riid
, &IID_IUnknown
) ||
48 IsEqualIID(riid
, &IID_IDropTarget
))
50 IUnknown_AddRef(iface
);
58 static ULONG WINAPI
DropTarget_AddRef(IDropTarget
* iface
)
60 droptarget_addref_called
++;
64 static ULONG WINAPI
DropTarget_Release(IDropTarget
* iface
)
66 droptarget_release_called
++;
70 static HRESULT WINAPI
DropTarget_DragEnter(IDropTarget
* iface
,
71 IDataObject
* pDataObj
,
72 DWORD grfKeyState
, POINTL pt
,
78 static HRESULT WINAPI
DropTarget_DragOver(IDropTarget
* iface
,
86 static HRESULT WINAPI
DropTarget_DragLeave(IDropTarget
* iface
)
91 static HRESULT WINAPI
DropTarget_Drop(IDropTarget
* iface
,
92 IDataObject
* pDataObj
, DWORD grfKeyState
,
93 POINTL pt
, DWORD
* pdwEffect
)
98 static const IDropTargetVtbl DropTarget_VTbl
=
100 DropTarget_QueryInterface
,
103 DropTarget_DragEnter
,
105 DropTarget_DragLeave
,
109 static IDropTarget DropTarget
= { &DropTarget_VTbl
};
115 hr
= RegisterDragDrop(GetDesktopWindow(), &DropTarget
);
116 ok(hr
== CO_E_NOTINITIALIZED
, "RegisterDragDrop without OLE initialized should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n", hr
);
120 hr
= RegisterDragDrop(GetDesktopWindow(), NULL
);
121 ok(hr
== E_INVALIDARG
, "RegisterDragDrop with NULL IDropTarget * should return E_INVALIDARG instead of 0x%08x\n", hr
);
123 hr
= RegisterDragDrop(NULL
, &DropTarget
);
124 ok(hr
== DRAGDROP_E_INVALIDHWND
, "RegisterDragDrop with NULL hwnd should return DRAGDROP_E_INVALIDHWND instead of 0x%08x\n", hr
);
126 hr
= RegisterDragDrop((HWND
)0xdeadbeef, &DropTarget
);
127 ok(hr
== DRAGDROP_E_INVALIDHWND
, "RegisterDragDrop with garbage hwnd should return DRAGDROP_E_INVALIDHWND instead of 0x%08x\n", hr
);
129 ok(droptarget_addref_called
== 0, "DropTarget_AddRef shouldn't have been called\n");
130 hr
= RegisterDragDrop(GetDesktopWindow(), &DropTarget
);
131 ok_ole_success(hr
, "RegisterDragDrop");
132 ok(droptarget_addref_called
== 1, "DropTarget_AddRef should have been called once, not %d times\n", droptarget_addref_called
);
134 hr
= RegisterDragDrop(GetDesktopWindow(), &DropTarget
);
135 ok(hr
== DRAGDROP_E_ALREADYREGISTERED
, "RegisterDragDrop with already registered hwnd should return DRAGDROP_E_ALREADYREGISTERED instead of 0x%08x\n", hr
);
137 ok(droptarget_release_called
== 0, "DropTarget_Release shouldn't have been called\n");
139 ok(droptarget_release_called
== 0, "DropTarget_Release shouldn't have been called\n");
141 hr
= RevokeDragDrop(GetDesktopWindow());
142 ok_ole_success(hr
, "RevokeDragDrop");
143 ok(droptarget_release_called
== 1, "DropTarget_Release should have been called once, not %d times\n", droptarget_release_called
);
145 hr
= RevokeDragDrop(NULL
);
146 ok(hr
== DRAGDROP_E_INVALIDHWND
, "RevokeDragDrop with NULL hwnd should return DRAGDROP_E_INVALIDHWND instead of 0x%08x\n", hr
);