101 lines
2.9 KiB
C
101 lines
2.9 KiB
C
/*
|
|
* COMMDLG/COMDLG32 functions
|
|
*
|
|
* Copyright 1994 Martin Ayotte
|
|
* Copyright 1996 Albrecht Kleine
|
|
* Copyright 1998 Bertho Stultiens
|
|
* Copyright 1999 Klaas van Gend
|
|
*/
|
|
|
|
#include <ctype.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "winbase.h"
|
|
#include "win.h"
|
|
#include "commdlg.h"
|
|
#include "module.h"
|
|
#include "debug.h"
|
|
#include "winproc.h"
|
|
|
|
DEFAULT_DEBUG_CHANNEL(commdlg)
|
|
|
|
|
|
#define COMDLG32_LAST_ERROR_NOT_ALLOCATED 0xF684F684
|
|
static DWORD COMDLG32_TlsIndex = COMDLG32_LAST_ERROR_NOT_ALLOCATED;
|
|
|
|
/***********************************************************************
|
|
* COMDLG32_DllEntryPoint [COMDLG32.entry]
|
|
*
|
|
* Initialisation code for the COMDLG32 DLL
|
|
* This call should implement the allocation of the TLS.
|
|
*
|
|
* RETURNS:
|
|
*
|
|
* BUGS:
|
|
* Remains unimplemented until Bertho finishes his ELF-DLL code
|
|
*/
|
|
BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance,
|
|
DWORD Reason,
|
|
LPVOID Reserved
|
|
);
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
* COMDLG32_AllocTlsForCommDlgExtError [internal]
|
|
*
|
|
* Allocates Thread Local Storage for the ComDlg32 local
|
|
* last extended error
|
|
*
|
|
* RETURNS:
|
|
* nothing.
|
|
*
|
|
* BUGS:
|
|
* 1) FIXME: This function is only temporary, as this code *SHOULD*
|
|
* be executed in the DLL Entrypoint. For now, it is done
|
|
* this way.
|
|
* 2) This allocated memory is NEVER freed again!
|
|
*/
|
|
void COMDLG32_AllocTlsForCommDlgExtError()
|
|
{
|
|
FIXME(commdlg, "TLS for CommDlgExtendedError allocated on-the-fly\n");
|
|
if (COMDLG32_TlsIndex == COMDLG32_LAST_ERROR_NOT_ALLOCATED)
|
|
COMDLG32_TlsIndex = TlsAlloc();
|
|
if (COMDLG32_TlsIndex == 0xFFFFFFFF)
|
|
ERR(commdlg, "No space for COMDLG32 TLS\n");
|
|
}
|
|
|
|
/***********************************************************************
|
|
* COMDLG32_SetCommDlgExtendedError [internal]
|
|
*
|
|
* Used to set the thread's local error value if a comdlg32 function fails.
|
|
*/
|
|
void COMDLG32_SetCommDlgExtendedError(DWORD err)
|
|
{
|
|
/*FIXME: This check and the resulting alloc should be removed
|
|
* when the DLL Entry code is finished
|
|
*/
|
|
if (COMDLG32_TlsIndex==COMDLG32_LAST_ERROR_NOT_ALLOCATED)
|
|
COMDLG32_AllocTlsForCommDlgExtError();
|
|
TlsSetValue(COMDLG32_TlsIndex, (void *)err);
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* CommDlgExtendedError [COMDLG32.5]
|
|
* [COMMDLG.26]
|
|
* Get the thread's local error value if a comdlg32 function fails.
|
|
* RETURNS
|
|
* Current error value which might not be valid
|
|
* if a previous call succeeded.
|
|
*/
|
|
DWORD WINAPI CommDlgExtendedError(void)
|
|
{
|
|
/*FIXME: This check and the resulting alloc should be removed
|
|
* when the DLL Entry code is finished
|
|
*/
|
|
if (COMDLG32_TlsIndex==COMDLG32_LAST_ERROR_NOT_ALLOCATED)
|
|
COMDLG32_AllocTlsForCommDlgExtError();
|
|
return (DWORD)TlsGetValue(COMDLG32_TlsIndex);
|
|
}
|