wine/dlls/commdlg/generic.c

99 lines
2.9 KiB
C
Raw Normal View History

/*
* 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"
#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);
}