| 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 | }
|
|---|