| 1 | /* $Id: cdlg32.cpp,v 1.5 2000-05-16 20:00:13 sandervl Exp $ */ | 
|---|
| 2 | /* | 
|---|
| 3 | *  Common Dialog Boxes interface (32 bit) | 
|---|
| 4 | *  Find/Replace | 
|---|
| 5 | * | 
|---|
| 6 | * Copyright 1999 Bertho A. Stultiens | 
|---|
| 7 | */ | 
|---|
| 8 |  | 
|---|
| 9 | #ifdef __WIN32OS2__ | 
|---|
| 10 | // ><DJR 17.05.99 Force to use C-interfaces for now to prevent CALLBACK definition compiler error | 
|---|
| 11 | #define CINTERFACE 1 | 
|---|
| 12 | #include <os2win.h> | 
|---|
| 13 | #else | 
|---|
| 14 | #include "winbase.h" | 
|---|
| 15 | #endif | 
|---|
| 16 | #include "commdlg.h" | 
|---|
| 17 | #include "cderr.h" | 
|---|
| 18 | #include "debugtools.h" | 
|---|
| 19 |  | 
|---|
| 20 | DEFAULT_DEBUG_CHANNEL(commdlg) | 
|---|
| 21 |  | 
|---|
| 22 | #include "cdlg.h" | 
|---|
| 23 |  | 
|---|
| 24 |  | 
|---|
| 25 | HINSTANCE       COMDLG32_hInstance = 0; | 
|---|
| 26 |  | 
|---|
| 27 | static DWORD    COMDLG32_TlsIndex; | 
|---|
| 28 | static int      COMDLG32_Attach = 0; | 
|---|
| 29 |  | 
|---|
| 30 | HINSTANCE       COMCTL32_hInstance = 0; | 
|---|
| 31 |  | 
|---|
| 32 | #ifndef __WIN32OS2__ | 
|---|
| 33 | HINSTANCE       SHELL32_hInstance = 0; | 
|---|
| 34 | HINSTANCE       SHLWAPI_hInstance = 0; | 
|---|
| 35 |  | 
|---|
| 36 | /* DPA */ | 
|---|
| 37 | HDPA    (WINAPI* COMDLG32_DPA_Create) (INT); | 
|---|
| 38 | LPVOID  (WINAPI* COMDLG32_DPA_GetPtr) (const HDPA, INT); | 
|---|
| 39 | LPVOID  (WINAPI* COMDLG32_DPA_DeletePtr) (const HDPA hdpa, INT i); | 
|---|
| 40 | LPVOID  (WINAPI* COMDLG32_DPA_DeleteAllPtrs) (const HDPA hdpa); | 
|---|
| 41 | INT     (WINAPI* COMDLG32_DPA_InsertPtr) (const HDPA, INT, LPVOID); | 
|---|
| 42 | BOOL    (WINAPI* COMDLG32_DPA_Destroy) (const HDPA); | 
|---|
| 43 |  | 
|---|
| 44 | /* IMAGELIST */ | 
|---|
| 45 | HICON   (WINAPI* COMDLG32_ImageList_GetIcon) (HIMAGELIST, INT, UINT); | 
|---|
| 46 | HIMAGELIST (WINAPI *COMDLG32_ImageList_LoadImageA) (HINSTANCE, LPCSTR, INT, INT, COLORREF, UINT, UINT); | 
|---|
| 47 | BOOL    (WINAPI* COMDLG32_ImageList_Draw) (HIMAGELIST himl, int i, HDC hdcDest, int x, int y, UINT fStyle); | 
|---|
| 48 | BOOL    (WINAPI* COMDLG32_ImageList_Destroy) (HIMAGELIST himl); | 
|---|
| 49 |  | 
|---|
| 50 | /* ITEMIDLIST */ | 
|---|
| 51 | LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST); | 
|---|
| 52 | LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILCombine)(LPCITEMIDLIST,LPCITEMIDLIST); | 
|---|
| 53 | LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILGetNext)(LPITEMIDLIST); | 
|---|
| 54 | BOOL (WINAPI *COMDLG32_PIDL_ILRemoveLastID)(LPCITEMIDLIST); | 
|---|
| 55 | BOOL (WINAPI *COMDLG32_PIDL_ILIsEqual)(LPCITEMIDLIST, LPCITEMIDLIST); | 
|---|
| 56 |  | 
|---|
| 57 | /* SHELL */ | 
|---|
| 58 | BOOL (WINAPI *COMDLG32_SHGetPathFromIDListA) (LPCITEMIDLIST,LPSTR); | 
|---|
| 59 | HRESULT (WINAPI *COMDLG32_SHGetSpecialFolderLocation)(HWND,INT,LPITEMIDLIST *); | 
|---|
| 60 | DWORD (WINAPI *COMDLG32_SHGetDesktopFolder)(IShellFolder **); | 
|---|
| 61 | DWORD   (WINAPI *COMDLG32_SHGetFileInfoA)(LPCSTR,DWORD,SHFILEINFOA*,UINT,UINT); | 
|---|
| 62 | DWORD (WINAPI *COMDLG32_SHFree)(LPVOID); | 
|---|
| 63 |  | 
|---|
| 64 | /* PATH */ | 
|---|
| 65 | BOOL (WINAPI *COMDLG32_PathIsRootA)(LPCSTR x); | 
|---|
| 66 | LPCSTR (WINAPI *COMDLG32_PathFindFilenameA)(LPCSTR path); | 
|---|
| 67 | DWORD (WINAPI *COMDLG32_PathRemoveFileSpecA)(LPSTR fn); | 
|---|
| 68 | BOOL (WINAPI *COMDLG32_PathMatchSpecW)(LPCWSTR x, LPCWSTR y); | 
|---|
| 69 | LPSTR (WINAPI *COMDLG32_PathAddBackslashA)(LPSTR path); | 
|---|
| 70 | #endif | 
|---|
| 71 |  | 
|---|
| 72 | /*********************************************************************** | 
|---|
| 73 | *      COMDLG32_DllEntryPoint                  (COMDLG32.entry) | 
|---|
| 74 | * | 
|---|
| 75 | *    Initialization code for the COMDLG32 DLL | 
|---|
| 76 | * | 
|---|
| 77 | * RETURNS: | 
|---|
| 78 | *      FALSE if sibling could not be loaded or instantiated twice, TRUE | 
|---|
| 79 | *      otherwise. | 
|---|
| 80 | */ | 
|---|
| 81 | BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) | 
|---|
| 82 | { | 
|---|
| 83 | TRACE("(%08x, %08lx, %p)\n", hInstance, Reason, Reserved); | 
|---|
| 84 |  | 
|---|
| 85 | switch(Reason) | 
|---|
| 86 | { | 
|---|
| 87 | case DLL_PROCESS_ATTACH: | 
|---|
| 88 | COMDLG32_Attach++; | 
|---|
| 89 | if(COMDLG32_hInstance) | 
|---|
| 90 | { | 
|---|
| 91 | dprintf(("comdlg32.dll instantiated twice in one address space!\n")); | 
|---|
| 92 | /* | 
|---|
| 93 | * We should return FALSE here, but that will break | 
|---|
| 94 | * most apps that use CreateProcess because we do | 
|---|
| 95 | * not yet support seperate address spaces. | 
|---|
| 96 | */ | 
|---|
| 97 | return TRUE; | 
|---|
| 98 | } | 
|---|
| 99 |  | 
|---|
| 100 | COMDLG32_hInstance = hInstance; | 
|---|
| 101 | DisableThreadLibraryCalls(hInstance); | 
|---|
| 102 |  | 
|---|
| 103 | if((COMDLG32_TlsIndex = TlsAlloc()) == 0xffffffff) | 
|---|
| 104 | { | 
|---|
| 105 | dprintf(("No space for COMDLG32 TLS\n")); | 
|---|
| 106 | return FALSE; | 
|---|
| 107 | } | 
|---|
| 108 |  | 
|---|
| 109 | #ifndef __WIN32OS2__ | 
|---|
| 110 | COMCTL32_hInstance = LoadLibraryA("COMCTL32.DLL"); | 
|---|
| 111 | SHELL32_hInstance = LoadLibraryA("SHELL32.DLL"); | 
|---|
| 112 | SHLWAPI_hInstance = LoadLibraryA("SHLWAPI.DLL"); | 
|---|
| 113 |  | 
|---|
| 114 | if (!COMCTL32_hInstance || !SHELL32_hInstance || !SHLWAPI_hInstance) | 
|---|
| 115 | { | 
|---|
| 116 | dprintf(("loading of comctl32 or shell32 or shlwapi failed\n")); | 
|---|
| 117 | return FALSE; | 
|---|
| 118 | } | 
|---|
| 119 | /* DPA */ | 
|---|
| 120 | *(VOID **)&COMDLG32_DPA_Create=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)328L); | 
|---|
| 121 | *(VOID **)&COMDLG32_DPA_Destroy=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)329L); | 
|---|
| 122 | *(VOID **)&COMDLG32_DPA_GetPtr=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)332L); | 
|---|
| 123 | *(VOID **)&COMDLG32_DPA_InsertPtr=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)334L); | 
|---|
| 124 | *(VOID **)&COMDLG32_DPA_DeletePtr=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)336L); | 
|---|
| 125 | *(VOID **)&COMDLG32_DPA_DeleteAllPtrs=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)337L); | 
|---|
| 126 |  | 
|---|
| 127 | /* IMAGELIST */ | 
|---|
| 128 | *(VOID **)&COMDLG32_ImageList_GetIcon=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_GetIcon"); | 
|---|
| 129 | *(VOID **)&COMDLG32_ImageList_LoadImageA=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_LoadImageA"); | 
|---|
| 130 | *(VOID **)&COMDLG32_ImageList_Draw=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_Draw"); | 
|---|
| 131 | *(VOID **)&COMDLG32_ImageList_Destroy=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_Destroy"); | 
|---|
| 132 |  | 
|---|
| 133 | /* ITEMISLIST */ | 
|---|
| 134 |  | 
|---|
| 135 | *(VOID **)&COMDLG32_PIDL_ILIsEqual =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)21L); | 
|---|
| 136 | *(VOID **)&COMDLG32_PIDL_ILCombine =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)25L); | 
|---|
| 137 | *(VOID **)&COMDLG32_PIDL_ILGetNext =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)153L); | 
|---|
| 138 | *(VOID **)&COMDLG32_PIDL_ILClone =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)18L); | 
|---|
| 139 | *(VOID **)&COMDLG32_PIDL_ILRemoveLastID =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)17L); | 
|---|
| 140 |  | 
|---|
| 141 | /* SHELL */ | 
|---|
| 142 |  | 
|---|
| 143 | *(VOID **)&COMDLG32_SHFree = (void*)GetProcAddress(SHELL32_hInstance,"SHFree"); | 
|---|
| 144 | *(VOID **)&COMDLG32_SHGetSpecialFolderLocation = (void*)GetProcAddress(SHELL32_hInstance,"SHGetSpecialFolderLocation"); | 
|---|
| 145 | *(VOID **)&COMDLG32_SHGetPathFromIDListA = (void*)GetProcAddress(SHELL32_hInstance,"SHGetPathFromIDListA"); | 
|---|
| 146 | *(VOID **)&COMDLG32_SHGetDesktopFolder = (void*)GetProcAddress(SHELL32_hInstance,"SHGetDesktopFolder"); | 
|---|
| 147 | *(VOID **)&COMDLG32_SHGetFileInfoA = (void*)GetProcAddress(SHELL32_hInstance,"SHGetFileInfoA"); | 
|---|
| 148 |  | 
|---|
| 149 | /* ### WARINIG ### | 
|---|
| 150 | We can't do a GetProcAddress to link to  StrRetToBuf[A|W] sine not all | 
|---|
| 151 | versions of the shlwapi are exporting these functions. When we are | 
|---|
| 152 | seperating the dlls then we have to dublicate code from shell32 into comdlg32. | 
|---|
| 153 | Till then just call these functions. These functions don't have any side effects | 
|---|
| 154 | so it won't break the use of any combination of native and buildin dll's (jsch) */ | 
|---|
| 155 |  | 
|---|
| 156 | /* PATH */ | 
|---|
| 157 | *(VOID **)&COMDLG32_PathMatchSpecW = (void*)GetProcAddress(SHLWAPI_hInstance,"PathMatchSpecW"); | 
|---|
| 158 | *(VOID **)&COMDLG32_PathIsRootA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathIsRootA"); | 
|---|
| 159 | *(VOID **)&COMDLG32_PathRemoveFileSpecA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathRemoveFileSpecA"); | 
|---|
| 160 | *(VOID **)&COMDLG32_PathFindFilenameA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathFindFileNameA"); | 
|---|
| 161 | *(VOID **)&COMDLG32_PathAddBackslashA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathAddBackslashA"); | 
|---|
| 162 | #endif | 
|---|
| 163 | break; | 
|---|
| 164 |  | 
|---|
| 165 | case DLL_PROCESS_DETACH: | 
|---|
| 166 | if(!--COMDLG32_Attach) | 
|---|
| 167 | { | 
|---|
| 168 | TlsFree(COMDLG32_TlsIndex); | 
|---|
| 169 | COMDLG32_hInstance = 0; | 
|---|
| 170 |  | 
|---|
| 171 | } | 
|---|
| 172 | #ifndef __WIN32OS2__ | 
|---|
| 173 | FreeLibrary(COMCTL32_hInstance); | 
|---|
| 174 | FreeLibrary(SHELL32_hInstance); | 
|---|
| 175 | FreeLibrary(SHLWAPI_hInstance); | 
|---|
| 176 | #endif | 
|---|
| 177 | break; | 
|---|
| 178 | } | 
|---|
| 179 | return TRUE; | 
|---|
| 180 | } | 
|---|
| 181 |  | 
|---|
| 182 |  | 
|---|
| 183 | /*********************************************************************** | 
|---|
| 184 | *      COMDLG32_AllocMem                       (internal) | 
|---|
| 185 | * Get memory for internal datastructure plus stringspace etc. | 
|---|
| 186 | *      RETURNS | 
|---|
| 187 | *              Pointer to a heap block: Succes | 
|---|
| 188 | *              NULL: Failure | 
|---|
| 189 | */ | 
|---|
| 190 | LPVOID COMDLG32_AllocMem( | 
|---|
| 191 | int size        /* [in] Block size to allocate */ | 
|---|
| 192 | ) { | 
|---|
| 193 | LPVOID ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); | 
|---|
| 194 | if(!ptr) | 
|---|
| 195 | { | 
|---|
| 196 | COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE); | 
|---|
| 197 | return NULL; | 
|---|
| 198 | } | 
|---|
| 199 | return ptr; | 
|---|
| 200 | } | 
|---|
| 201 |  | 
|---|
| 202 |  | 
|---|
| 203 | /*********************************************************************** | 
|---|
| 204 | *      COMDLG32_SetCommDlgExtendedError        (internal) | 
|---|
| 205 | * | 
|---|
| 206 | * Used to set the thread's local error value if a comdlg32 function fails. | 
|---|
| 207 | */ | 
|---|
| 208 | void COMDLG32_SetCommDlgExtendedError(DWORD err) | 
|---|
| 209 | { | 
|---|
| 210 | TRACE("(%08lx)\n", err); | 
|---|
| 211 | TlsSetValue(COMDLG32_TlsIndex, (void *)err); | 
|---|
| 212 | } | 
|---|
| 213 |  | 
|---|
| 214 |  | 
|---|
| 215 | /*********************************************************************** | 
|---|
| 216 | *      CommDlgExtendedError                    (COMDLG32.5) | 
|---|
| 217 | * | 
|---|
| 218 | * Get the thread's local error value if a comdlg32 function fails. | 
|---|
| 219 | *      RETURNS | 
|---|
| 220 | *              Current error value which might not be valid | 
|---|
| 221 | *              if a previous call succeeded. | 
|---|
| 222 | */ | 
|---|
| 223 | DWORD WINAPI CommDlgExtendedError(void) | 
|---|
| 224 | { | 
|---|
| 225 | return (DWORD)TlsGetValue(COMDLG32_TlsIndex); | 
|---|
| 226 | } | 
|---|