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

Last change on this file since 1567 was 1556, checked in by sandervl, 26 years ago

Wine 991031 update

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