2 * SHAppBarMessage implementation
4 * Copyright 2008 Vincent Povirk for CodeWeavers
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
34 #include "wine/debug.h"
35 #include "wine/unicode.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(appbar
);
46 struct appbar_response
52 /*************************************************************************
53 * SHAppBarMessage [SHELL32.@]
55 UINT_PTR WINAPI
SHAppBarMessage(DWORD msg
, PAPPBARDATA data
)
57 struct appbar_cmd command
;
58 struct appbar_response
* response
;
61 HWND appbarmsg_window
;
64 static const WCHAR classname
[] = {'W','i','n','e','A','p','p','B','a','r',0};
68 TRACE("msg=%d, data={cb=%d, hwnd=%p, callback=%x, edge=%d, rc=%s, lparam=%lx}\n",
69 msg
, data
->cbSize
, data
->hWnd
, data
->uCallbackMessage
, data
->uEdge
,
70 wine_dbgstr_rect(&data
->rc
), data
->lParam
);
72 if (data
->cbSize
< sizeof(APPBARDATA
))
74 WARN("data at %p is too small\n", data
);
80 return_map
= CreateFileMappingW(INVALID_HANDLE_VALUE
, 0, PAGE_READWRITE
, 0, sizeof(struct appbar_response
), NULL
);
81 if (return_map
== NULL
)
83 ERR("couldn't create file mapping\n");
86 command
.return_map
= return_map
;
88 command
.return_process
= GetCurrentProcessId();
90 appbarmsg_window
= FindWindowW(classname
, NULL
);
91 if (appbarmsg_window
== NULL
)
93 ERR("couldn't find appbar window\n");
94 CloseHandle(return_map
);
99 cds
.cbData
= sizeof(command
);
100 cds
.lpData
= &command
;
102 SendMessageTimeoutW(appbarmsg_window
, WM_COPYDATA
, (WPARAM
)data
->hWnd
, (LPARAM
)&cds
, SMTO_BLOCK
, INFINITE
, &msg_result
);
104 return_view
= MapViewOfFile(return_map
, FILE_MAP_READ
, 0, 0, sizeof(struct appbar_response
));
105 if (return_view
== NULL
)
107 ERR("MapViewOfFile failed\n");
108 CloseHandle(return_map
);
112 response
= (struct appbar_response
*)return_view
;
114 ret
= response
->result
;
115 *data
= response
->abd
;
117 UnmapViewOfFile(return_view
);
119 CloseHandle(return_map
);