2 * Common Dialog Boxes interface (32 bit)
5 * Copyright 1999 Bertho A. Stultiens
9 #include "wine/winbase16.h"
12 #include "debugtools.h"
14 DEFAULT_DEBUG_CHANNEL(commdlg);
19 HINSTANCE COMDLG32_hInstance = 0;
20 HINSTANCE16 COMDLG32_hInstance16 = 0;
22 static DWORD COMDLG32_TlsIndex;
23 static int COMDLG32_Attach = 0;
25 HINSTANCE COMCTL32_hInstance = 0;
26 HINSTANCE SHELL32_hInstance = 0;
27 HINSTANCE SHLWAPI_hInstance = 0;
30 BOOL (WINAPI* COMDLG32_ImageList_Draw) (HIMAGELIST himl, int i, HDC hdcDest, int x, int y, UINT fStyle);
33 LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST);
34 LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILCombine)(LPCITEMIDLIST,LPCITEMIDLIST);
35 LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILGetNext)(LPITEMIDLIST);
36 BOOL (WINAPI *COMDLG32_PIDL_ILRemoveLastID)(LPCITEMIDLIST);
37 BOOL (WINAPI *COMDLG32_PIDL_ILIsEqual)(LPCITEMIDLIST, LPCITEMIDLIST);
40 BOOL (WINAPI *COMDLG32_SHGetPathFromIDListA) (LPCITEMIDLIST,LPSTR);
41 HRESULT (WINAPI *COMDLG32_SHGetSpecialFolderLocation)(HWND,INT,LPITEMIDLIST *);
42 DWORD (WINAPI *COMDLG32_SHGetDesktopFolder)(IShellFolder **);
43 DWORD (WINAPI *COMDLG32_SHGetFileInfoA)(LPCSTR,DWORD,SHFILEINFOA*,UINT,UINT);
44 LPVOID (WINAPI *COMDLG32_SHAlloc)(DWORD);
45 DWORD (WINAPI *COMDLG32_SHFree)(LPVOID);
46 HRESULT (WINAPI *COMDLG32_StrRetToBufA)(LPSTRRET,LPITEMIDLIST,LPSTR,DWORD);
47 HRESULT (WINAPI *COMDLG32_StrRetToBufW)(LPSTRRET,LPITEMIDLIST,LPWSTR,DWORD);
50 BOOL (WINAPI *COMDLG32_PathIsRootA)(LPCSTR x);
51 LPCSTR (WINAPI *COMDLG32_PathFindFilenameA)(LPCSTR path);
52 DWORD (WINAPI *COMDLG32_PathRemoveFileSpecA)(LPSTR fn);
53 BOOL (WINAPI *COMDLG32_PathMatchSpecW)(LPCWSTR x, LPCWSTR y);
54 LPSTR (WINAPI *COMDLG32_PathAddBackslashA)(LPSTR path);
56 /***********************************************************************
57 * COMDLG32_DllEntryPoint (COMDLG32.entry)
59 * Initialization code for the COMDLG32 DLL
62 * FALSE if sibling could not be loaded or instantiated twice, TRUE
65 BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
67 TRACE("(%08x, %08lx, %p)\n", hInstance, Reason, Reserved);
71 case DLL_PROCESS_ATTACH:
73 if(COMDLG32_hInstance)
75 ERR("comdlg32.dll instantiated twice in one address space!\n");
77 * We should return FALSE here, but that will break
78 * most apps that use CreateProcess because we do
79 * not yet support seperate address spaces.
84 COMDLG32_hInstance = hInstance;
85 DisableThreadLibraryCalls(hInstance);
87 if(!COMDLG32_hInstance16)
89 if(!(COMDLG32_hInstance16 = LoadLibrary16("commdlg.dll")))
91 ERR("Could not load sibling commdlg.dll\n");
96 COMDLG32_TlsIndex = 0xffffffff;
98 COMCTL32_hInstance = LoadLibraryA("COMCTL32.DLL");
99 SHELL32_hInstance = LoadLibraryA("SHELL32.DLL");
100 SHLWAPI_hInstance = LoadLibraryA("SHLWAPI.DLL");
102 if (!COMCTL32_hInstance || !SHELL32_hInstance || !SHLWAPI_hInstance)
104 ERR("loading of comctl32 or shell32 or shlwapi failed\n");
109 COMDLG32_ImageList_Draw=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_Draw");
113 COMDLG32_PIDL_ILIsEqual =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)21L);
114 COMDLG32_PIDL_ILCombine =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)25L);
115 COMDLG32_PIDL_ILGetNext =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)153L);
116 COMDLG32_PIDL_ILClone =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)18L);
117 COMDLG32_PIDL_ILRemoveLastID =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)17L);
121 COMDLG32_SHAlloc = (void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)196L);
122 COMDLG32_SHFree = (void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)195L);
123 COMDLG32_SHGetSpecialFolderLocation = (void*)GetProcAddress(SHELL32_hInstance,"SHGetSpecialFolderLocation");
124 COMDLG32_SHGetPathFromIDListA = (void*)GetProcAddress(SHELL32_hInstance,"SHGetPathFromIDListA");
125 COMDLG32_SHGetDesktopFolder = (void*)GetProcAddress(SHELL32_hInstance,"SHGetDesktopFolder");
126 COMDLG32_SHGetFileInfoA = (void*)GetProcAddress(SHELL32_hInstance,"SHGetFileInfoA");
129 We can't do a GetProcAddress to link to StrRetToBuf[A|W] sine not all
130 versions of the shlwapi are exporting these functions. When we are
131 seperating the dlls then we have to dublicate code from shell32 into comdlg32.
132 Till then just call these functions. These functions don't have any side effects
133 so it won't break the use of any combination of native and buildin dll's (jsch) */
136 COMDLG32_PathMatchSpecW = (void*)GetProcAddress(SHLWAPI_hInstance,"PathMatchSpecW");
137 COMDLG32_PathIsRootA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathIsRootA");
138 COMDLG32_PathRemoveFileSpecA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathRemoveFileSpecA");
139 COMDLG32_PathFindFilenameA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathFindFileNameA");
140 COMDLG32_PathAddBackslashA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathAddBackslashA");
143 case DLL_PROCESS_DETACH:
144 if(!--COMDLG32_Attach)
146 if (COMDLG32_TlsIndex != 0xffffffff)
147 TlsFree(COMDLG32_TlsIndex);
148 COMDLG32_TlsIndex = 0xffffffff;
149 COMDLG32_hInstance = 0;
150 if(COMDLG32_hInstance16)
151 FreeLibrary16(COMDLG32_hInstance16);
154 FreeLibrary(COMCTL32_hInstance);
155 FreeLibrary(SHELL32_hInstance);
156 FreeLibrary(SHLWAPI_hInstance);
163 /***********************************************************************
164 * COMDLG32_AllocMem (internal)
165 * Get memory for internal datastructure plus stringspace etc.
167 * Pointer to a heap block: Succes
170 LPVOID COMDLG32_AllocMem(
171 int size /* [in] Block size to allocate */
173 LPVOID ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
176 COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
183 /***********************************************************************
184 * COMDLG32_SetCommDlgExtendedError (internal)
186 * Used to set the thread's local error value if a comdlg32 function fails.
188 void COMDLG32_SetCommDlgExtendedError(DWORD err)
190 TRACE("(%08lx)\n", err);
191 if (COMDLG32_TlsIndex == 0xffffffff)
192 COMDLG32_TlsIndex = TlsAlloc();
193 if (COMDLG32_TlsIndex != 0xffffffff)
194 TlsSetValue(COMDLG32_TlsIndex, (void *)err);
196 FIXME("No Tls Space\n");
200 /***********************************************************************
201 * CommDlgExtendedError (COMDLG32.5)
203 * Get the thread's local error value if a comdlg32 function fails.
205 * Current error value which might not be valid
206 * if a previous call succeeded.
208 DWORD WINAPI CommDlgExtendedError(void)
210 if (COMDLG32_TlsIndex != 0xffffffff)
211 return (DWORD)TlsGetValue(COMDLG32_TlsIndex);
214 FIXME("No Tls Space\n");