| 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 |
|
|---|
| 14 | DEFAULT_DEBUG_CHANNEL(commdlg)
|
|---|
| 15 |
|
|---|
| 16 | #include "cdlg.h"
|
|---|
| 17 |
|
|---|
| 18 | HINSTANCE COMDLG32_hInstance = 0;
|
|---|
| 19 | HINSTANCE16 COMDLG32_hInstance16 = 0;
|
|---|
| 20 |
|
|---|
| 21 | static DWORD COMDLG32_TlsIndex;
|
|---|
| 22 | static int COMDLG32_Attach = 0;
|
|---|
| 23 |
|
|---|
| 24 | HINSTANCE COMCTL32_hInstance = 0;
|
|---|
| 25 | HINSTANCE SHELL32_hInstance = 0;
|
|---|
| 26 |
|
|---|
| 27 | HDPA (* WINAPI COMDLG32_DPA_Create) (INT);
|
|---|
| 28 | LPVOID (* WINAPI COMDLG32_DPA_GetPtr) (const HDPA, INT);
|
|---|
| 29 | LPVOID (* WINAPI COMDLG32_DPA_DeleteAllPtrs) (const HDPA hdpa);
|
|---|
| 30 | LPVOID (* WINAPI COMDLG32_DPA_DeletePtr) (const HDPA hdpa, INT i);
|
|---|
| 31 | INT (* WINAPI COMDLG32_DPA_InsertPtr) (const HDPA, INT, LPVOID);
|
|---|
| 32 | BOOL (* WINAPI COMDLG32_DPA_Destroy) (const HDPA);
|
|---|
| 33 |
|
|---|
| 34 | HICON (* WINAPI COMDLG32_ImageList_GetIcon) (HIMAGELIST, INT, UINT);
|
|---|
| 35 | HIMAGELIST (* WINAPI COMDLG32_ImageList_LoadImageA) (HINSTANCE, LPCSTR, INT, INT, COLORREF, UINT, UINT);
|
|---|
| 36 | BOOL (* WINAPI COMDLG32_ImageList_Draw) (HIMAGELIST himl, int i, HDC hdcDest, int x, int y, UINT fStyle);
|
|---|
| 37 | BOOL (* 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 | */
|
|---|
| 48 | BOOL 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 | */
|
|---|
| 120 | LPVOID 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 | */
|
|---|
| 138 | void 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 | */
|
|---|
| 152 | DWORD WINAPI CommDlgExtendedError(void)
|
|---|
| 153 | {
|
|---|
| 154 | return (DWORD)TlsGetValue(COMDLG32_TlsIndex);
|
|---|
| 155 | }
|
|---|