?? w_env.c
字號(hào):
/***
*w_env.c - W version of GetEnvironmentStrings.
*
* Copyright (c) 1993-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Use GetEnvironmentStringsW if available, otherwise use A version.
*
*******************************************************************************/
#include <cruntime.h>
#include <internal.h>
#include <stdlib.h>
#include <setlocal.h>
#include <awint.h>
#include <dbgint.h>
#define USE_W 1
#define USE_A 2
/***
*LPVOID __cdecl __crtGetEnvironmentStringsW - Get wide environment.
*
*Purpose:
* Internal support function. Tries to use NLS API call
* GetEnvironmentStringsW if available and uses GetEnvironmentStringsA
* if it must. If neither are available it fails and returns 0.
*
*Entry:
* VOID
*
*Exit:
* LPVOID - pointer to environment block
*
*Exceptions:
*
*******************************************************************************/
LPVOID __cdecl __crtGetEnvironmentStringsW(
VOID
)
{
static int f_use = 0;
void *penv = NULL;
char *pch;
wchar_t *pwch;
wchar_t *wbuffer;
int total_size = 0;
int str_size;
/*
* Look for unstubbed 'preferred' flavor. Otherwise use available flavor.
* Must actually call the function to ensure it's not a stub.
*/
if ( 0 == f_use )
{
if ( NULL != (penv = GetEnvironmentStringsW()) )
f_use = USE_W;
else if ( NULL != (penv = GetEnvironmentStringsA()) )
f_use = USE_A;
else
return NULL;
}
/* Use "W" version */
if ( USE_W == f_use )
{
if ( NULL == penv )
if ( NULL == (penv = GetEnvironmentStringsW()) )
return NULL;
/* find out how big a buffer is needed */
pwch = penv;
while ( *pwch != L'\0' ) {
if ( *++pwch == L'\0' )
pwch++;
}
total_size = (char *)pwch - (char *)penv + sizeof( wchar_t );
/* allocate the buffer */
if ( NULL == (wbuffer = _malloc_crt( total_size )) ) {
FreeEnvironmentStringsW( penv );
return NULL;
}
/* copy environment strings to buffer */
memcpy( wbuffer, penv, total_size );
FreeEnvironmentStringsW( penv );
return (LPVOID)wbuffer;
}
/* Use "A" version */
if ( USE_A == f_use )
{
/*
* Convert strings and return the requested information.
*/
if ( NULL == penv )
if ( NULL == (penv = GetEnvironmentStringsA()) )
return NULL;
pch = penv;
/* find out how big a buffer we need */
while ( *pch != '\0' )
{
if ( 0 == (str_size =
MultiByteToWideChar( __lc_codepage,
MB_PRECOMPOSED,
pch,
-1,
NULL,
0 )) )
return 0;
total_size += str_size;
pch += strlen(pch) + 1;
}
/* room for final NULL */
total_size++;
/* allocate enough space for chars */
if ( NULL == (wbuffer = (wchar_t *)
_malloc_crt( total_size * sizeof( wchar_t ) )) )
{
FreeEnvironmentStringsA( penv );
return NULL;
}
/* do the conversion */
pch = penv;
pwch = wbuffer;
while (*pch != '\0')
{
if ( 0 == MultiByteToWideChar( __lc_codepage,
MB_PRECOMPOSED,
pch,
-1,
pwch,
total_size - (pwch -
wbuffer) ) )
{
_free_crt( wbuffer );
FreeEnvironmentStringsA( penv );
return NULL;
}
pch += strlen(pch) + 1;
pwch += wcslen(pwch) + 1;
}
*pwch = L'\0';
FreeEnvironmentStringsA( penv );
return (LPVOID)wbuffer;
}
else /* f_use is neither USE_A nor USE_W */
return NULL;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -