source: trunk/src/shell32/shellord.c@ 5087

Last change on this file since 5087 was 4561, checked in by sandervl, 25 years ago

merged with latest Wine (11-05-2000)

File size: 25.7 KB
Line 
1/* $Id: shellord.c,v 1.2 2000-11-06 10:20:56 sandervl Exp $ */
2/*
3 * The parameters of many functions changes between different OS versions
4 * (NT uses Unicode strings, 95 uses ASCII strings)
5 *
6 * Copyright 1997 Marcus Meissner
7 * 1998 Jürgen Schmied
8 */
9#ifdef __WIN32OS2__
10#define ICOM_CINTERFACE 1
11#include <odin.h>
12#endif
13#include <string.h>
14#include <stdio.h>
15#include "winerror.h"
16#include "winreg.h"
17#include "debugtools.h"
18#include "winnls.h"
19#include "heap.h"
20
21#include "shellapi.h"
22#include "shlguid.h"
23#include "shlobj.h"
24#include "shell32_main.h"
25#include "wine/undocshell.h"
26
27DEFAULT_DEBUG_CHANNEL(shell);
28
29/*************************************************************************
30 * ParseFieldA [internal]
31 *
32 * copys a field from a ',' delimited string
33 *
34 * first field is nField = 1
35 */
36DWORD WINAPI ParseFieldA(
37 LPCSTR src,
38 DWORD nField,
39 LPSTR dst,
40 DWORD len)
41{
42 WARN("('%s',0x%08lx,%p,%ld) semi-stub.\n",src,nField,dst,len);
43
44 if (!src || !src[0] || !dst || !len)
45 return 0;
46
47 /* skip n fields delimited by ',' */
48 while (nField > 1)
49 {
50 if (*src=='\0') return FALSE;
51 if (*(src++)==',') nField--;
52 }
53
54 /* copy part till the next ',' to dst */
55 while ( *src!='\0' && *src!=',' && (len--)>0 ) *(dst++)=*(src++);
56
57 /* finalize the string */
58 *dst=0x0;
59
60 return TRUE;
61}
62
63/*************************************************************************
64 * ParseFieldW [internal]
65 *
66 * copys a field from a ',' delimited string
67 *
68 * first field is nField = 1
69 */
70DWORD WINAPI ParseFieldW(LPCWSTR src, DWORD nField, LPWSTR dst, DWORD len)
71{
72 FIXME("('%s',0x%08lx,%p,%ld) stub.\n",
73 debugstr_w(src), nField, dst, len);
74 return FALSE;
75}
76
77/*************************************************************************
78 * ParseFieldAW [SHELL32.58]
79 */
80DWORD WINAPI ParseFieldAW(LPCVOID src, DWORD nField, LPVOID dst, DWORD len)
81{
82 if (SHELL_OsIsUnicode())
83 return ParseFieldW(src, nField, dst, len);
84 return ParseFieldA(src, nField, dst, len);
85}
86
87/*************************************************************************
88 * GetFileNameFromBrowse [SHELL32.63]
89 *
90 */
91BOOL WINAPI GetFileNameFromBrowse(
92 HWND hwndOwner,
93 LPSTR lpstrFile,
94 DWORD nMaxFile,
95 LPCSTR lpstrInitialDir,
96 LPCSTR lpstrDefExt,
97 LPCSTR lpstrFilter,
98 LPCSTR lpstrTitle)
99{
100 FIXME("(%04x,%s,%ld,%s,%s,%s,%s):stub.\n",
101 hwndOwner, lpstrFile, nMaxFile, lpstrInitialDir, lpstrDefExt,
102 lpstrFilter, lpstrTitle);
103
104 /* puts up a Open Dialog and requests input into targetbuf */
105 /* OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_FILEMUSTEXIST|OFN_unknown */
106 strcpy(lpstrFile,"x:\\dummy.exe");
107 return 1;
108}
109
110/*************************************************************************
111 * SHGetSetSettings [SHELL32.68]
112 */
113VOID WINAPI SHGetSetSettings(DWORD x, DWORD y, DWORD z)
114{
115 FIXME("0x%08lx 0x%08lx 0x%08lx\n", x, y, z);
116}
117
118/*************************************************************************
119 * SHGetSettings [SHELL32.@]
120 *
121 * NOTES
122 * the registry path are for win98 (tested)
123 * and possibly are the same in nt40
124 */
125void WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask, DWORD dwx)
126{
127 HKEY hKey;
128 DWORD dwData;
129 DWORD dwDataSize = sizeof (DWORD);
130
131 TRACE("(%p 0x%08lx 0x%08lx)\n",lpsfs,dwMask, dwx);
132
133 if (RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
134 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0))
135 return;
136
137 if ( (SSF_SHOWEXTENSIONS & dwMask) && !RegQueryValueExA(hKey, "HideFileExt", 0, 0, (LPBYTE)&dwData, &dwDataSize))
138 lpsfs->fShowExtensions = ((dwData == 0) ? 0 : 1);
139
140 if ( (SSF_SHOWINFOTIP & dwMask) && !RegQueryValueExA(hKey, "ShowInfoTip", 0, 0, (LPBYTE)&dwData, &dwDataSize))
141 lpsfs->fShowInfoTip = ((dwData == 0) ? 0 : 1);
142
143 if ( (SSF_DONTPRETTYPATH & dwMask) && !RegQueryValueExA(hKey, "DontPrettyPath", 0, 0, (LPBYTE)&dwData, &dwDataSize))
144 lpsfs->fDontPrettyPath = ((dwData == 0) ? 0 : 1);
145
146 if ( (SSF_HIDEICONS & dwMask) && !RegQueryValueExA(hKey, "HideIcons", 0, 0, (LPBYTE)&dwData, &dwDataSize))
147 lpsfs->fHideIcons = ((dwData == 0) ? 0 : 1);
148
149 if ( (SSF_MAPNETDRVBUTTON & dwMask) && !RegQueryValueExA(hKey, "MapNetDrvBtn", 0, 0, (LPBYTE)&dwData, &dwDataSize))
150 lpsfs->fMapNetDrvBtn = ((dwData == 0) ? 0 : 1);
151
152 if ( (SSF_SHOWATTRIBCOL & dwMask) && !RegQueryValueExA(hKey, "ShowAttribCol", 0, 0, (LPBYTE)&dwData, &dwDataSize))
153 lpsfs->fShowAttribCol = ((dwData == 0) ? 0 : 1);
154
155 if (((SSF_SHOWALLOBJECTS | SSF_SHOWSYSFILES) & dwMask) && !RegQueryValueExA(hKey, "Hidden", 0, 0, (LPBYTE)&dwData, &dwDataSize))
156 { if (dwData == 0)
157 { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 0;
158 if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 0;
159 }
160 else if (dwData == 1)
161 { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 1;
162 if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 0;
163 }
164 else if (dwData == 2)
165 { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 0;
166 if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 1;
167 }
168 }
169 RegCloseKey (hKey);
170
171 TRACE("-- 0x%04x\n", *(WORD*)lpsfs);
172}
173
174/*************************************************************************
175 * SHShellFolderView_Message [SHELL32.73]
176 *
177 * PARAMETERS
178 * hwndCabinet defines the explorer cabinet window that contains the
179 * shellview you need to communicate with
180 * uMsg identifying the SFVM enum to perform
181 * lParam
182 *
183 * NOTES
184 * Message SFVM_REARRANGE = 1
185 * This message gets sent when a column gets clicked to instruct the
186 * shell view to re-sort the item list. lParam identifies the column
187 * that was clicked.
188 */
189int WINAPI SHShellFolderView_Message(
190 HWND hwndCabinet,
191 DWORD dwMessage,
192 DWORD dwParam)
193{
194 FIXME("%04x %08lx %08lx stub\n",hwndCabinet, dwMessage, dwParam);
195 return 0;
196}
197
198/*************************************************************************
199 * RegisterShellHook [SHELL32.181]
200 *
201 * PARAMS
202 * hwnd [I] window handle
203 * y [I] flag ????
204 *
205 * NOTES
206 * exported by ordinal
207 */
208BOOL WINAPI RegisterShellHook(
209 HWND hWnd,
210 DWORD dwType)
211{
212 FIXME("(0x%08x,0x%08lx):stub.\n",hWnd, dwType);
213 return TRUE;
214}
215/*************************************************************************
216 * ShellMessageBoxW [SHELL32.182]
217 *
218 * Format and output errormessage.
219 *
220 * idText resource ID of title or LPSTR
221 * idTitle resource ID of title or LPSTR
222 *
223 * NOTES
224 * exported by ordinal
225 */
226int WINAPIV ShellMessageBoxW(
227 HINSTANCE hInstance,
228 HWND hWnd,
229 LPCWSTR lpText,
230 LPCWSTR lpCaption,
231 UINT uType,
232 ...)
233{
234 WCHAR szText[100],szTitle[100],szTemp[256];
235 LPCWSTR pszText = szText, pszTitle = szTitle;
236 va_list args;
237 va_start(args, uType);
238 /* wvsprintfA(buf,fmt, args); */
239
240 TRACE("(%08lx,%08lx,%p,%p,%08x)\n",
241 (DWORD)hInstance,(DWORD)hWnd,lpText,lpCaption,uType);
242
243 if (!HIWORD(lpCaption))
244 LoadStringW(hInstance, (DWORD)lpCaption, szTitle, 100);
245 else
246 pszTitle = lpCaption;
247
248 if (!HIWORD(lpText))
249 LoadStringW(hInstance, (DWORD)lpText, szText, 100);
250 else
251 pszText = lpText;
252
253 FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
254 szText, 0, 0, szTemp, 256, (LPDWORD) args);
255
256 va_end(args);
257
258 return MessageBoxW(hWnd,szTemp,szTitle,uType);
259}
260
261/*************************************************************************
262 * ShellMessageBoxA [SHELL32.183]
263 */
264int WINAPIV ShellMessageBoxA(
265 HINSTANCE hInstance,
266 HWND hWnd,
267 LPCSTR lpText,
268 LPCSTR lpCaption,
269 UINT uType,
270 ...)
271{
272 char szText[100],szTitle[100],szTemp[256];
273 LPCSTR pszText = szText, pszTitle = szTitle;
274 va_list args;
275 va_start(args, uType);
276 /* wvsprintfA(buf,fmt, args); */
277
278 TRACE("(%08lx,%08lx,%p,%p,%08x)\n",
279 (DWORD)hInstance,(DWORD)hWnd,lpText,lpCaption,uType);
280
281 if (!HIWORD(lpCaption))
282 LoadStringA(hInstance, (DWORD)lpCaption, szTitle, 100);
283 else
284 pszTitle = lpCaption;
285
286 if (!HIWORD(lpText))
287 LoadStringA(hInstance, (DWORD)lpText, szText, 100);
288 else
289 pszText = lpText;
290
291 FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
292 szText, 0, 0, szTemp, 256, (LPDWORD) args);
293
294 va_end(args);
295
296 return MessageBoxA(hWnd,szTemp,szTitle,uType);
297}
298
299/*************************************************************************
300 * SHFree [SHELL32.195]
301 *
302 * NOTES
303 * free_ptr() - frees memory using IMalloc
304 * exported by ordinal
305 */
306#define MEM_DEBUG 0
307void WINAPI SHFree(LPVOID x)
308{
309#if MEM_DEBUG
310 WORD len = *(LPWORD)((LPBYTE)x-2);
311
312 if ( *(LPWORD)((LPBYTE)x+len) != 0x7384)
313 ERR("MAGIC2!\n");
314
315 if ( (*(LPWORD)((LPBYTE)x-4)) != 0x8271)
316 ERR("MAGIC1!\n");
317 else
318 memset((LPBYTE)x-4, 0xde, len+6);
319
320 TRACE("%p len=%u\n",x, len);
321
322 x = (LPBYTE) x - 4;
323#else
324 TRACE("%p\n",x);
325#endif
326 HeapFree(GetProcessHeap(), 0, x);
327}
328
329/*************************************************************************
330 * SHAlloc [SHELL32.196]
331 *
332 * NOTES
333 * void *task_alloc(DWORD len), uses SHMalloc allocator
334 * exported by ordinal
335 */
336LPVOID WINAPI SHAlloc(DWORD len)
337{
338 LPBYTE ret;
339
340#if MEM_DEBUG
341 ret = (LPVOID) HeapAlloc(GetProcessHeap(),0,len+6);
342#else
343 ret = (LPVOID) HeapAlloc(GetProcessHeap(),0,len);
344#endif
345
346#if MEM_DEBUG
347 *(LPWORD)(ret) = 0x8271;
348 *(LPWORD)(ret+2) = (WORD)len;
349 *(LPWORD)(ret+4+len) = 0x7384;
350 ret += 4;
351 memset(ret, 0xdf, len);
352#endif
353 TRACE("%lu bytes at %p\n",len, ret);
354 return (LPVOID)ret;
355}
356
357/*************************************************************************
358 * SHRegisterDragDrop [SHELL32.86]
359 *
360 * NOTES
361 * exported by ordinal
362 */
363HRESULT WINAPI SHRegisterDragDrop(
364 HWND hWnd,
365 LPDROPTARGET pDropTarget)
366{
367 FIXME("(0x%08x,%p):stub.\n", hWnd, pDropTarget);
368 if (GetShellOle()) return pRegisterDragDrop(hWnd, pDropTarget);
369 return 0;
370}
371
372/*************************************************************************
373 * SHRevokeDragDrop [SHELL32.87]
374 *
375 * NOTES
376 * exported by ordinal
377 */
378HRESULT WINAPI SHRevokeDragDrop(HWND hWnd)
379{
380 FIXME("(0x%08x):stub.\n",hWnd);
381 return 0;
382}
383
384/*************************************************************************
385 * SHDoDragDrop [SHELL32.88]
386 *
387 * NOTES
388 * exported by ordinal
389 */
390HRESULT WINAPI SHDoDragDrop(
391 HWND hWnd,
392 LPDATAOBJECT lpDataObject,
393 LPDROPSOURCE lpDropSource,
394 DWORD dwOKEffect,
395 LPDWORD pdwEffect)
396{
397 FIXME("(0x%04x %p %p 0x%08lx %p):stub.\n",
398 hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect);
399 return 0;
400}
401
402/*************************************************************************
403 * ArrangeWindows [SHELL32.184]
404 *
405 */
406WORD WINAPI ArrangeWindows(
407 HWND hwndParent,
408 DWORD dwReserved,
409 LPCRECT lpRect,
410 WORD cKids,
411 CONST HWND * lpKids)
412{
413 FIXME("(0x%08x 0x%08lx %p 0x%04x %p):stub.\n",
414 hwndParent, dwReserved, lpRect, cKids, lpKids);
415 return 0;
416}
417
418/*************************************************************************
419 * SignalFileOpen [SHELL32.103]
420 *
421 * NOTES
422 * exported by ordinal
423 */
424DWORD WINAPI
425SignalFileOpen (DWORD dwParam1)
426{
427 FIXME("(0x%08lx):stub.\n", dwParam1);
428
429 return 0;
430}
431
432/*************************************************************************
433 * SHAddToRecentDocs [SHELL32.234]
434 *
435 * PARAMETERS
436 * uFlags [IN] SHARD_PATH or SHARD_PIDL
437 * pv [IN] string or pidl, NULL clears the list
438 *
439 * NOTES
440 * exported by name
441 */
442DWORD WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv)
443{ if (SHARD_PIDL==uFlags)
444 { FIXME("(0x%08x,pidl=%p):stub.\n", uFlags,pv);
445 }
446 else
447 { FIXME("(0x%08x,%s):stub.\n", uFlags,(char*)pv);
448 }
449 return 0;
450}
451/*************************************************************************
452 * SHCreateShellFolderViewEx [SHELL32.174]
453 *
454 * NOTES
455 * see IShellFolder::CreateViewObject
456 */
457HRESULT WINAPI SHCreateShellFolderViewEx(
458 LPCSHELLFOLDERVIEWINFO psvcbi, /*[in ] shelltemplate struct*/
459 LPSHELLVIEW* ppv) /*[out] IShellView pointer*/
460{
461 IShellView * psf;
462 HRESULT hRes;
463
464 TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=0x%08lx\n",
465 psvcbi->pshf, psvcbi->pidlFolder, psvcbi->lpfnCallback,
466 psvcbi->uViewMode, psvcbi->dwUser);
467
468 psf = IShellView_Constructor(psvcbi->pshf);
469
470 if (!psf)
471 return E_OUTOFMEMORY;
472
473 IShellView_AddRef(psf);
474 hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppv);
475 IShellView_Release(psf);
476
477 return hRes;
478}
479/*************************************************************************
480 * SHWinHelp [SHELL32.127]
481 *
482 */
483HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z)
484{ FIXME("0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",v,w,x,z);
485 return 0;
486}
487/*************************************************************************
488 * SHRunControlPanel [SHELL32.161]
489 *
490 */
491HRESULT WINAPI SHRunControlPanel (DWORD x, DWORD z)
492{ FIXME("0x%08lx 0x%08lx stub\n",x,z);
493 return 0;
494}
495/*************************************************************************
496 * ShellExecuteEx [SHELL32.291]
497 *
498 */
499BOOL WINAPI ShellExecuteExAW (LPVOID sei)
500{ if (SHELL_OsIsUnicode())
501 return ShellExecuteExW (sei);
502 return ShellExecuteExA (sei);
503}
504/*************************************************************************
505 * ShellExecuteExA [SHELL32.292]
506 *
507 * placeholder in the commandline:
508 * %1 file
509 * %2 printer
510 * %3 driver
511 * %4 port
512 * %I adress of a global item ID (explorer switch /idlist)
513 * %L ??? path/url/current file ???
514 * %S ???
515 * %* all following parameters (see batfile)
516 */
517BOOL WINAPI ShellExecuteExA (LPSHELLEXECUTEINFOA sei)
518{ CHAR szApplicationName[MAX_PATH],szCommandline[MAX_PATH],szPidl[20];
519 LPSTR pos;
520 int gap, len;
521 STARTUPINFOA startup;
522 PROCESS_INFORMATION info;
523
524 WARN("mask=0x%08lx hwnd=0x%04x verb=%s file=%s parm=%s dir=%s show=0x%08x class=%s incomplete\n",
525 sei->fMask, sei->hwnd, sei->lpVerb, sei->lpFile,
526 sei->lpParameters, sei->lpDirectory, sei->nShow,
527 (sei->fMask & SEE_MASK_CLASSNAME) ? sei->lpClass : "not used");
528
529 ZeroMemory(szApplicationName,MAX_PATH);
530 if (sei->lpFile)
531 strcpy(szApplicationName, sei->lpFile);
532
533 ZeroMemory(szCommandline,MAX_PATH);
534 if (sei->lpParameters)
535 strcpy(szCommandline, sei->lpParameters);
536
537 if (sei->fMask & (SEE_MASK_CLASSKEY | SEE_MASK_INVOKEIDLIST | SEE_MASK_ICON | SEE_MASK_HOTKEY |
538 SEE_MASK_CONNECTNETDRV | SEE_MASK_FLAG_DDEWAIT |
539 SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI | SEE_MASK_UNICODE |
540 SEE_MASK_NO_CONSOLE | SEE_MASK_ASYNCOK | SEE_MASK_HMONITOR ))
541 {
542 FIXME("flags ignored: 0x%08lx\n", sei->fMask);
543 }
544
545 /* launch a document by fileclass like 'Wordpad.Document.1' */
546 if (sei->fMask & SEE_MASK_CLASSNAME)
547 {
548 /* the commandline contains 'c:\Path\wordpad.exe "%1"' */
549 HCR_GetExecuteCommand(sei->lpClass, (sei->lpVerb) ? sei->lpVerb : "open", szCommandline, 256);
550 /* fixme: get the extension of lpFile, check if it fits to the lpClass */
551 TRACE("SEE_MASK_CLASSNAME->'%s'\n", szCommandline);
552 }
553
554 /* process the IDList */
555 if ( (sei->fMask & SEE_MASK_INVOKEIDLIST) == SEE_MASK_INVOKEIDLIST) /*0x0c*/
556 {
557 SHGetPathFromIDListA (sei->lpIDList,szApplicationName);
558 TRACE("-- idlist=%p (%s)\n", sei->lpIDList, szApplicationName);
559 }
560 else
561 {
562 if (sei->fMask & SEE_MASK_IDLIST )
563 {
564 pos = strstr(szCommandline, "%I");
565 if (pos)
566 {
567 LPVOID pv;
568 HGLOBAL hmem = SHAllocShared ( sei->lpIDList, ILGetSize(sei->lpIDList), 0);
569 pv = SHLockShared(hmem,0);
570 sprintf(szPidl,":%p",pv );
571 SHUnlockShared(pv);
572
573 gap = strlen(szPidl);
574 len = strlen(pos)-2;
575 memmove(pos+gap,pos+2,len);
576 memcpy(pos,szPidl,gap);
577
578 }
579 }
580 }
581
582 TRACE("execute:'%s','%s'\n",szApplicationName, szCommandline);
583
584 strcat(szApplicationName, " ");
585 strcat(szApplicationName, szCommandline);
586
587 ZeroMemory(&startup,sizeof(STARTUPINFOA));
588 startup.cb = sizeof(STARTUPINFOA);
589
590 if (! CreateProcessA(NULL, szApplicationName,
591 NULL, NULL, FALSE, 0,
592 NULL, NULL, &startup, &info))
593 {
594 sei->hInstApp = GetLastError();
595 return FALSE;
596 }
597
598 sei->hInstApp = 33;
599
600 /* Give 30 seconds to the app to come up */
601 if ( WaitForInputIdle ( info.hProcess, 30000 ) == 0xFFFFFFFF )
602 ERR("WaitForInputIdle failed: Error %ld\n", GetLastError() );
603
604 if(sei->fMask & SEE_MASK_NOCLOSEPROCESS)
605 sei->hProcess = info.hProcess;
606 else
607 CloseHandle( info.hProcess );
608 CloseHandle( info.hThread );
609 return TRUE;
610}
611/*************************************************************************
612 * ShellExecuteExW [SHELL32.293]
613 *
614 */
615BOOL WINAPI ShellExecuteExW (LPSHELLEXECUTEINFOW sei)
616{ SHELLEXECUTEINFOA seiA;
617 DWORD ret;
618
619 TRACE("%p\n", sei);
620
621 memcpy(&seiA, sei, sizeof(SHELLEXECUTEINFOA));
622
623 if (sei->lpVerb)
624 seiA.lpVerb = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpVerb);
625
626 if (sei->lpFile)
627 seiA.lpFile = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpFile);
628
629 if (sei->lpParameters)
630 seiA.lpParameters = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpParameters);
631
632 if (sei->lpDirectory)
633 seiA.lpDirectory = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpDirectory);
634
635 if ((sei->fMask & SEE_MASK_CLASSNAME) && sei->lpClass)
636 seiA.lpClass = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpClass);
637 else
638 seiA.lpClass = NULL;
639
640 ret = ShellExecuteExA(&seiA);
641
642 if (seiA.lpVerb) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpVerb );
643 if (seiA.lpFile) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpFile );
644 if (seiA.lpParameters) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpParameters );
645 if (seiA.lpDirectory) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpDirectory );
646 if (seiA.lpClass) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpClass );
647
648 return ret;
649}
650
651static LPUNKNOWN SHELL32_IExplorerInterface=0;
652/*************************************************************************
653 * SHSetInstanceExplorer [SHELL32.176]
654 *
655 * NOTES
656 * Sets the interface
657 */
658HRESULT WINAPI SHSetInstanceExplorer (LPUNKNOWN lpUnknown)
659{ TRACE("%p\n", lpUnknown);
660 SHELL32_IExplorerInterface = lpUnknown;
661 return (HRESULT) lpUnknown;
662}
663/*************************************************************************
664 * SHGetInstanceExplorer [SHELL32.256]
665 *
666 * NOTES
667 * gets the interface pointer of the explorer and a reference
668 */
669HRESULT WINAPI SHGetInstanceExplorer (LPUNKNOWN * lpUnknown)
670{ TRACE("%p\n", lpUnknown);
671
672 *lpUnknown = SHELL32_IExplorerInterface;
673
674 if (!SHELL32_IExplorerInterface)
675 return E_FAIL;
676
677 IUnknown_AddRef(SHELL32_IExplorerInterface);
678 return NOERROR;
679}
680/*************************************************************************
681 * SHFreeUnusedLibraries [SHELL32.123]
682 *
683 * NOTES
684 * exported by name
685 */
686void WINAPI SHFreeUnusedLibraries (void)
687{
688 FIXME("stub\n");
689}
690/*************************************************************************
691 * DAD_SetDragImage [SHELL32.136]
692 *
693 * NOTES
694 * exported by name
695 */
696BOOL WINAPI DAD_SetDragImage(
697 HIMAGELIST himlTrack,
698 LPPOINT lppt)
699{
700 FIXME("%p %p stub\n",himlTrack, lppt);
701 return 0;
702}
703/*************************************************************************
704 * DAD_ShowDragImage [SHELL32.137]
705 *
706 * NOTES
707 * exported by name
708 */
709BOOL WINAPI DAD_ShowDragImage(BOOL bShow)
710{
711 FIXME("0x%08x stub\n",bShow);
712 return 0;
713}
714/*************************************************************************
715 * ReadCabinetState [NT 4.0:SHELL32.651]
716 *
717 */
718HRESULT WINAPI ReadCabinetState(DWORD u, DWORD v)
719{ FIXME("0x%04lx 0x%04lx stub\n",u,v);
720 return 0;
721}
722/*************************************************************************
723 * WriteCabinetState [NT 4.0:SHELL32.652]
724 *
725 */
726HRESULT WINAPI WriteCabinetState(DWORD u)
727{ FIXME("0x%04lx stub\n",u);
728 return 0;
729}
730/*************************************************************************
731 * FileIconInit [SHELL32.660]
732 *
733 */
734BOOL WINAPI FileIconInit(BOOL bFullInit)
735{ FIXME("(%s)\n", bFullInit ? "true" : "false");
736 return 0;
737}
738/*************************************************************************
739 * IsUserAdmin [NT 4.0:SHELL32.680]
740 *
741 */
742HRESULT WINAPI IsUserAdmin(void)
743{ FIXME("stub\n");
744 return TRUE;
745}
746
747/*************************************************************************
748 * SHAllocShared [SHELL32.520]
749 *
750 * NOTES
751 * parameter1 is return value from HeapAlloc
752 * parameter2 is equal to the size allocated with HeapAlloc
753 * parameter3 is return value from GetCurrentProcessId
754 *
755 * the return value is posted as lParam with 0x402 (WM_USER+2) to somewhere
756 * WM_USER+2 could be the undocumented CWM_SETPATH
757 * the allocated memory contains a pidl
758 */
759HGLOBAL WINAPI SHAllocShared(LPVOID psrc, DWORD size, DWORD procID)
760{ HGLOBAL hmem;
761 LPVOID pmem;
762
763 TRACE("ptr=%p size=0x%04lx procID=0x%04lx\n",psrc,size,procID);
764 hmem = GlobalAlloc(GMEM_FIXED, size);
765 if (!hmem)
766 return 0;
767
768 pmem = GlobalLock (hmem);
769
770 if (! pmem)
771 return 0;
772
773 memcpy (pmem, psrc, size);
774 GlobalUnlock(hmem);
775 return hmem;
776}
777/*************************************************************************
778 * SHLockShared [SHELL32.521]
779 *
780 * NOTES
781 * parameter1 is return value from SHAllocShared
782 * parameter2 is return value from GetCurrentProcessId
783 * the receiver of (WM_USER+2) trys to lock the HANDLE (?)
784 * the returnvalue seems to be a memoryadress
785 */
786LPVOID WINAPI SHLockShared(HANDLE hmem, DWORD procID)
787{ TRACE("handle=0x%04x procID=0x%04lx\n",hmem,procID);
788 return GlobalLock(hmem);
789}
790/*************************************************************************
791 * SHUnlockShared [SHELL32.522]
792 *
793 * NOTES
794 * parameter1 is return value from SHLockShared
795 */
796BOOL WINAPI SHUnlockShared(LPVOID pv)
797{
798 TRACE("%p\n",pv);
799 return GlobalUnlock((HANDLE)pv);
800}
801/*************************************************************************
802 * SHFreeShared [SHELL32.523]
803 *
804 * NOTES
805 * parameter1 is return value from SHAllocShared
806 * parameter2 is return value from GetCurrentProcessId
807 */
808BOOL WINAPI SHFreeShared(
809 HANDLE hMem,
810 DWORD pid)
811{
812 TRACE("handle=0x%04x 0x%04lx\n",hMem,pid);
813 return GlobalFree(hMem);
814}
815
816/*************************************************************************
817 * SetAppStartingCursor [SHELL32.99]
818 */
819HRESULT WINAPI SetAppStartingCursor(HWND u, DWORD v)
820{ FIXME("hwnd=0x%04x 0x%04lx stub\n",u,v );
821 return 0;
822}
823/*************************************************************************
824 * SHLoadOLE [SHELL32.151]
825 *
826 */
827HRESULT WINAPI SHLoadOLE(DWORD u)
828{ FIXME("0x%04lx stub\n",u);
829 return S_OK;
830}
831/*************************************************************************
832 * DriveType [SHELL32.64]
833 *
834 */
835HRESULT WINAPI DriveType(DWORD u)
836{ FIXME("0x%04lx stub\n",u);
837 return 0;
838}
839/*************************************************************************
840 * SHAbortInvokeCommand [SHELL32.198]
841 *
842 */
843HRESULT WINAPI SHAbortInvokeCommand(void)
844{ FIXME("stub\n");
845 return 1;
846}
847/*************************************************************************
848 * SHOutOfMemoryMessageBox [SHELL32.126]
849 *
850 */
851int WINAPI SHOutOfMemoryMessageBox(
852 HWND hwndOwner,
853 LPCSTR lpCaption,
854 UINT uType)
855{
856 FIXME("0x%04x %s 0x%08x stub\n",hwndOwner, lpCaption, uType);
857 return 0;
858}
859/*************************************************************************
860 * SHFlushClipboard [SHELL32.121]
861 *
862 */
863HRESULT WINAPI SHFlushClipboard(void)
864{ FIXME("stub\n");
865 return 1;
866}
867
868/*************************************************************************
869 * SHWaitForFileToOpen [SHELL32.97]
870 *
871 */
872BOOL WINAPI SHWaitForFileToOpen(
873 LPCITEMIDLIST pidl,
874 DWORD dwFlags,
875 DWORD dwTimeout)
876{
877 FIXME("%p 0x%08lx 0x%08lx stub\n", pidl, dwFlags, dwTimeout);
878 return 0;
879}
880/*************************************************************************
881 * Control_FillCache_RunDLL [SHELL32.8]
882 *
883 */
884HRESULT WINAPI Control_FillCache_RunDLL(HWND hWnd, HANDLE hModule, DWORD w, DWORD x)
885{ FIXME("0x%04x 0x%04x 0x%04lx 0x%04lx stub\n",hWnd, hModule,w,x);
886 return 0;
887}
888/*************************************************************************
889 * RunDLL_CallEntry16 [SHELL32.122]
890 * the name is propably wrong
891 */
892HRESULT WINAPI RunDLL_CallEntry16(DWORD v, DWORD w, DWORD x, DWORD y, DWORD z)
893{ FIXME("0x%04lx 0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",v,w,x,y,z);
894 return 0;
895}
896
897/************************************************************************
898 * shell32_654 [SHELL32.654]
899 *
900 * NOTES: first parameter seems to be a pointer (same as passed to WriteCabinetState)
901 * second one could be a size (0x0c). The size is the same as the structure saved to
902 * HCU\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState
903 * I'm (js) guessing: this one is just ReadCabinetState ;-)
904 */
905HRESULT WINAPI shell32_654 (DWORD x, DWORD y)
906{ FIXME("0x%08lx 0x%08lx stub\n",x,y);
907 return 0;
908}
909
910/************************************************************************
911 * RLBuildListOfPaths [SHELL32.146]
912 *
913 * NOTES
914 * builds a DPA
915 */
916DWORD WINAPI RLBuildListOfPaths (void)
917{ FIXME("stub\n");
918 return 0;
919}
920/************************************************************************
921 * SHValidateUNC [SHELL32.173]
922 *
923 */
924HRESULT WINAPI SHValidateUNC (DWORD x, DWORD y, DWORD z)
925{
926 FIXME("0x%08lx 0x%08lx 0x%08lx stub\n",x,y,z);
927 return 0;
928}
929
930/************************************************************************
931 * DoEnvironmentSubstA [SHELL32.1222]
932 *
933 */
934HRESULT WINAPI DoEnvironmentSubstA(LPSTR x, LPSTR y)
935{
936 FIXME("(%s, %s) stub\n", debugstr_a(x), debugstr_a(y));
937 return 0;
938}
939
940/************************************************************************
941 * DoEnvironmentSubstW [SHELL32.1223]
942 *
943 */
944HRESULT WINAPI DoEnvironmentSubstW(LPWSTR x, LPWSTR y)
945{
946 FIXME("(%s, %s): stub\n", debugstr_w(x), debugstr_w(y));
947 return 0;
948}
949
950/************************************************************************
951 * DoEnvironmentSubst [SHELL32.53]
952 *
953 */
954HRESULT WINAPI DoEnvironmentSubstAW(LPVOID x, LPVOID y)
955{
956 if (SHELL_OsIsUnicode())
957 return DoEnvironmentSubstW(x, y);
958 return DoEnvironmentSubstA(x, y);
959}
960
961/*************************************************************************
962 * shell32_243 [SHELL32.243]
963 *
964 * Win98+ by-ordinal routine. In Win98 this routine returns zero and
965 * does nothing else. Possibly this does something in NT or SHELL32 5.0?
966 *
967 */
968
969BOOL WINAPI shell32_243(DWORD a, DWORD b)
970{
971 return FALSE;
972}
973
974/*************************************************************************
975 * SHELL32_714 [SHELL32]
976 */
977DWORD WINAPI SHELL32_714(LPVOID x)
978{
979 FIXME("(%s)stub\n", debugstr_w(x));
980 return 0;
981}
Note: See TracBrowser for help on using the repository browser.