2 * clipboard helper functions
4 * Copyright 2000 Juergen Schmied <juergen.schmied@debitel.de>
6 * For copy & paste functions within contextmenus does the shell use
7 * the OLE clipboard functions in combination with dataobjects.
8 * The OLE32.DLL gets loaded with LoadLibrary
10 * - a right mousebutton-copy sets the following formats:
13 * Prefered Drop Effect
14 * Shell Object Offsets
18 * OlePrivateData (ClipboardDataObjectInterface)
26 #include "undocshell.h"
27 #include "shell32_main.h"
30 #include "debugtools.h"
32 DEFAULT_DEBUG_CHANNEL(shell);
34 static int refClipCount = 0;
35 static HINSTANCE hShellOle32 = 0;
37 /**************************************************************************
42 void InitShellOle(void)
46 /**************************************************************************
51 void FreeShellOle(void)
56 FreeLibrary(hShellOle32);
60 /**************************************************************************
63 * make sure OLE32.DLL is loaded
65 BOOL GetShellOle(void)
69 hShellOle32 = LoadLibraryA("ole32.dll");
72 pOleInitialize=(void*)GetProcAddress(hShellOle32,"OleInitialize");
73 pOleUninitialize=(void*)GetProcAddress(hShellOle32,"OleUninitialize");
74 pRegisterDragDrop=(void*)GetProcAddress(hShellOle32,"RegisterDragDrop");
75 pRevokeDragDrop=(void*)GetProcAddress(hShellOle32,"RevokeDragDrop");
76 pDoDragDrop=(void*)GetProcAddress(hShellOle32,"DoDragDrop");
77 pReleaseStgMedium=(void*)GetProcAddress(hShellOle32,"ReleaseStgMedium");
78 pOleSetClipboard=(void*)GetProcAddress(hShellOle32,"OleSetClipboard");
79 pOleGetClipboard=(void*)GetProcAddress(hShellOle32,"OleGetClipboard");
88 /**************************************************************************
91 * creates a CF_HDROP structure
93 HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
96 int rootsize = 0,size = 0;
97 char szRootPath[MAX_PATH];
98 char szFileName[MAX_PATH];
100 DROPFILES *pDropFiles;
103 TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
105 /* get the size needed */
106 size = sizeof(DROPFILES);
108 SHGetPathFromIDListA(pidlRoot, szRootPath);
109 PathAddBackslashA(szRootPath);
110 rootsize = strlen(szRootPath);
112 for (i=0; i<cidl;i++)
114 _ILSimpleGetText(apidl[i], szFileName, MAX_PATH);
115 size += rootsize + strlen(szFileName) + 1;
120 /* Fill the structure */
121 hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
122 if(!hGlobal) return hGlobal;
124 pDropFiles = (DROPFILES *)GlobalLock(hGlobal);
125 pDropFiles->pFiles = sizeof(DROPFILES);
126 pDropFiles->fWide = FALSE;
128 offset = pDropFiles->pFiles;
129 strcpy(szFileName, szRootPath);
131 for (i=0; i<cidl;i++)
134 _ILSimpleGetText(apidl[i], szFileName + rootsize, MAX_PATH - rootsize);
135 size = strlen(szFileName) + 1;
136 strcpy(((char*)pDropFiles)+offset, szFileName);
140 ((char*)pDropFiles)[offset] = 0;
141 GlobalUnlock(hGlobal);
146 HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
148 int i,offset = 0, sizePidl, size;
152 TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
154 /* get the size needed */
155 size = sizeof(CIDA) + sizeof (UINT)*(cidl); /* header */
156 size += ILGetSize (pidlRoot); /* root pidl */
157 for(i=0; i<cidl; i++)
159 size += ILGetSize(apidl[i]); /* child pidls */
162 /* fill the structure */
163 hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
164 if(!hGlobal) return hGlobal;
165 pcida = GlobalLock (hGlobal);
169 offset = sizeof(CIDA) + sizeof (UINT)*(cidl);
170 pcida->aoffset[0] = offset; /* first element */
171 sizePidl = ILGetSize (pidlRoot);
172 memcpy(((LPBYTE)pcida)+offset, pidlRoot, sizePidl);
175 for(i=0; i<cidl; i++) /* child pidls */
177 pcida->aoffset[i+1] = offset;
178 sizePidl = ILGetSize(apidl[i]);
179 memcpy(((LPBYTE)pcida)+offset, apidl[i], sizePidl);
183 GlobalUnlock(hGlobal);
187 HGLOBAL RenderSHELLIDLISTOFFSET (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
193 HGLOBAL RenderFILECONTENTS (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
199 HGLOBAL RenderFILEDESCRIPTOR (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
205 HGLOBAL RenderFILENAME (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
208 char szTemp[MAX_PATH], *szFileName;
211 TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
213 /* build name of first file */
214 SHGetPathFromIDListA(pidlRoot, szTemp);
215 PathAddBackslashA(szTemp);
216 len = strlen(szTemp);
217 _ILSimpleGetText(apidl[0], szTemp+len, MAX_PATH - len);
218 size = strlen(szTemp) + 1;
220 /* fill the structure */
221 hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
222 if(!hGlobal) return hGlobal;
223 szFileName = (char *)GlobalLock(hGlobal);
224 GlobalUnlock(hGlobal);
228 HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags)
233 TRACE("(0x%08lx)\n", dwFlags);
235 hGlobal = GlobalAlloc(GHND|GMEM_SHARE, sizeof(DWORD));
236 if(!hGlobal) return hGlobal;
237 pdwFlag = (DWORD*)GlobalLock(hGlobal);
239 GlobalUnlock(hGlobal);
243 /**************************************************************************
246 * checks if there is something in the clipboard we can use
248 BOOL IsDataInClipboard (HWND hwnd)
252 if (OpenClipboard(hwnd))
254 if (GetOpenClipboardWindow())
256 ret = IsClipboardFormatAvailable(CF_TEXT);