source: trunk/src/comdlg32/cdlg32.cpp@ 10367

Last change on this file since 10367 was 3544, checked in by sandervl, 25 years ago

import directly from dlls; not dynamically -> fixes crash due to recent shlwapi changes

File size: 8.0 KB
Line 
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
20DEFAULT_DEBUG_CHANNEL(commdlg)
21
22#include "cdlg.h"
23
24
25HINSTANCE COMDLG32_hInstance = 0;
26
27static DWORD COMDLG32_TlsIndex;
28static int COMDLG32_Attach = 0;
29
30HINSTANCE COMCTL32_hInstance = 0;
31
32#ifndef __WIN32OS2__
33HINSTANCE SHELL32_hInstance = 0;
34HINSTANCE SHLWAPI_hInstance = 0;
35
36/* DPA */
37HDPA (WINAPI* COMDLG32_DPA_Create) (INT);
38LPVOID (WINAPI* COMDLG32_DPA_GetPtr) (const HDPA, INT);
39LPVOID (WINAPI* COMDLG32_DPA_DeletePtr) (const HDPA hdpa, INT i);
40LPVOID (WINAPI* COMDLG32_DPA_DeleteAllPtrs) (const HDPA hdpa);
41INT (WINAPI* COMDLG32_DPA_InsertPtr) (const HDPA, INT, LPVOID);
42BOOL (WINAPI* COMDLG32_DPA_Destroy) (const HDPA);
43
44/* IMAGELIST */
45HICON (WINAPI* COMDLG32_ImageList_GetIcon) (HIMAGELIST, INT, UINT);
46HIMAGELIST (WINAPI *COMDLG32_ImageList_LoadImageA) (HINSTANCE, LPCSTR, INT, INT, COLORREF, UINT, UINT);
47BOOL (WINAPI* COMDLG32_ImageList_Draw) (HIMAGELIST himl, int i, HDC hdcDest, int x, int y, UINT fStyle);
48BOOL (WINAPI* COMDLG32_ImageList_Destroy) (HIMAGELIST himl);
49
50/* ITEMIDLIST */
51LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST);
52LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILCombine)(LPCITEMIDLIST,LPCITEMIDLIST);
53LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILGetNext)(LPITEMIDLIST);
54BOOL (WINAPI *COMDLG32_PIDL_ILRemoveLastID)(LPCITEMIDLIST);
55BOOL (WINAPI *COMDLG32_PIDL_ILIsEqual)(LPCITEMIDLIST, LPCITEMIDLIST);
56
57/* SHELL */
58BOOL (WINAPI *COMDLG32_SHGetPathFromIDListA) (LPCITEMIDLIST,LPSTR);
59HRESULT (WINAPI *COMDLG32_SHGetSpecialFolderLocation)(HWND,INT,LPITEMIDLIST *);
60DWORD (WINAPI *COMDLG32_SHGetDesktopFolder)(IShellFolder **);
61DWORD (WINAPI *COMDLG32_SHGetFileInfoA)(LPCSTR,DWORD,SHFILEINFOA*,UINT,UINT);
62DWORD (WINAPI *COMDLG32_SHFree)(LPVOID);
63
64/* PATH */
65BOOL (WINAPI *COMDLG32_PathIsRootA)(LPCSTR x);
66LPCSTR (WINAPI *COMDLG32_PathFindFilenameA)(LPCSTR path);
67DWORD (WINAPI *COMDLG32_PathRemoveFileSpecA)(LPSTR fn);
68BOOL (WINAPI *COMDLG32_PathMatchSpecW)(LPCWSTR x, LPCWSTR y);
69LPSTR (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 */
81BOOL 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 */
190LPVOID 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 */
208void 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 */
223DWORD WINAPI CommDlgExtendedError(void)
224{
225 return (DWORD)TlsGetValue(COMDLG32_TlsIndex);
226}
Note: See TracBrowser for help on using the repository browser.