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

Last change on this file since 1555 was 1548, checked in by sandervl, 26 years ago

Port of Wine common dialogs (not all)

File size: 4.7 KB
Line 
1/* $Id: cdlg32.cpp,v 1.1 1999-11-02 19:09:41 sandervl Exp $ */
2/*
3 * Common Dialog Boxes interface (32 bit) (990815)
4 * Find/Replace
5 *
6 * Copyright 1999 Bertho A. Stultiens
7 */
8
9#include <os2win.h>
10#include "commdlg.h"
11#include "cderr.h"
12#include "debugtools.h"
13
14DEFAULT_DEBUG_CHANNEL(commdlg)
15
16#include "cdlg.h"
17
18HINSTANCE COMDLG32_hInstance = 0;
19HINSTANCE16 COMDLG32_hInstance16 = 0;
20
21static DWORD COMDLG32_TlsIndex;
22static int COMDLG32_Attach = 0;
23
24HINSTANCE COMCTL32_hInstance = 0;
25HINSTANCE SHELL32_hInstance = 0;
26
27HDPA (* WINAPI COMDLG32_DPA_Create) (INT);
28LPVOID (* WINAPI COMDLG32_DPA_GetPtr) (const HDPA, INT);
29LPVOID (* WINAPI COMDLG32_DPA_DeleteAllPtrs) (const HDPA hdpa);
30LPVOID (* WINAPI COMDLG32_DPA_DeletePtr) (const HDPA hdpa, INT i);
31INT (* WINAPI COMDLG32_DPA_InsertPtr) (const HDPA, INT, LPVOID);
32BOOL (* WINAPI COMDLG32_DPA_Destroy) (const HDPA);
33
34HICON (* WINAPI COMDLG32_ImageList_GetIcon) (HIMAGELIST, INT, UINT);
35HIMAGELIST (* WINAPI COMDLG32_ImageList_LoadImageA) (HINSTANCE, LPCSTR, INT, INT, COLORREF, UINT, UINT);
36BOOL (* WINAPI COMDLG32_ImageList_Draw) (HIMAGELIST himl, int i, HDC hdcDest, int x, int y, UINT fStyle);
37BOOL (* WINAPI COMDLG32_ImageList_Destroy) (HIMAGELIST himl);
38
39/***********************************************************************
40 * COMDLG32_DllEntryPoint (COMDLG32.entry)
41 *
42 * Initialization code for the COMDLG32 DLL
43 *
44 * RETURNS:
45 * FALSE if sibling could not be loaded or instantiated twice, TRUE
46 * otherwise.
47 */
48BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
49{
50// TRACE("(%08x, %08lx, %p)\n", hInstance, Reason, Reserved);
51
52 switch(Reason)
53 {
54 case DLL_PROCESS_ATTACH:
55 COMDLG32_Attach++;
56 if(COMDLG32_hInstance)
57 {
58 dprintf(("comdlg32.dll instantiated twice in one address space!\n"));
59 /*
60 * We should return FALSE here, but that will break
61 * most apps that use CreateProcess because we do
62 * not yet support seperate address spaces.
63 */
64 return TRUE;
65 }
66
67 COMDLG32_hInstance = hInstance;
68 DisableThreadLibraryCalls(hInstance);
69
70 if((COMDLG32_TlsIndex = TlsAlloc()) == 0xffffffff)
71 {
72 dprintf(("No space for COMDLG32 TLS\n"));
73 return FALSE;
74 }
75
76 COMCTL32_hInstance = LoadLibraryA("COMCTL32.DLL");
77 SHELL32_hInstance = LoadLibraryA("SHELL32.DLL");
78
79 if (!COMCTL32_hInstance || !SHELL32_hInstance)
80 {
81 dprintf(("loading of comctl32 or shell32 failed\n"));
82 return FALSE;
83 }
84
85 *(VOID **)&COMDLG32_DPA_Create=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)328L);
86 *(VOID **)&COMDLG32_DPA_Destroy=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)329L);
87 *(VOID **)&COMDLG32_DPA_GetPtr=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)332L);
88 *(VOID **)&COMDLG32_DPA_InsertPtr=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)334L);
89 *(VOID **)&COMDLG32_DPA_DeletePtr=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)336L);
90 *(VOID **)&COMDLG32_DPA_DeleteAllPtrs=(void*)GetProcAddress(COMCTL32_hInstance, (LPCSTR)337L);
91
92 *(VOID **)&COMDLG32_ImageList_GetIcon=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_GetIcon");
93 *(VOID **)&COMDLG32_ImageList_LoadImageA=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_LoadImageA");
94 *(VOID **)&COMDLG32_ImageList_Draw=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_Draw");
95 *(VOID **)&COMDLG32_ImageList_Destroy=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_Destroy");
96 break;
97
98 case DLL_PROCESS_DETACH:
99 if(!--COMDLG32_Attach)
100 {
101 TlsFree(COMDLG32_TlsIndex);
102 COMDLG32_hInstance = 0;
103
104 }
105 FreeLibrary(COMCTL32_hInstance);
106 FreeLibrary(SHELL32_hInstance);
107 break;
108 }
109 return TRUE;
110}
111
112
113/***********************************************************************
114 * COMDLG32_AllocMem (internal)
115 * Get memory for internal datastructure plus stringspace etc.
116 * RETURNS
117 * Pointer to a heap block: Succes
118 * NULL: Failure
119 */
120LPVOID COMDLG32_AllocMem(
121 int size /* [in] Block size to allocate */
122) {
123 LPVOID ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
124 if(!ptr)
125 {
126 COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
127 return NULL;
128 }
129 return ptr;
130}
131
132
133/***********************************************************************
134 * COMDLG32_SetCommDlgExtendedError (internal)
135 *
136 * Used to set the thread's local error value if a comdlg32 function fails.
137 */
138void COMDLG32_SetCommDlgExtendedError(DWORD err)
139{
140 TlsSetValue(COMDLG32_TlsIndex, (void *)err);
141}
142
143
144/***********************************************************************
145 * CommDlgExtendedError (COMDLG32.5)
146 *
147 * Get the thread's local error value if a comdlg32 function fails.
148 * RETURNS
149 * Current error value which might not be valid
150 * if a previous call succeeded.
151 */
152DWORD WINAPI CommDlgExtendedError(void)
153{
154 return (DWORD)TlsGetValue(COMDLG32_TlsIndex);
155}
Note: See TracBrowser for help on using the repository browser.