Share via


getenv_s、_wgetenv_s

更新 : 2007 年 11 月

現在の環境から値を取得します。これらの関数は、「CRT のセキュリティ強化」に説明されているように、getenv、_wgetenv のセキュリティが強化されたバージョンです。

errno_t getenv_s( 
   size_t *pReturnValue,
   char* buffer,
   size_t numberOfElements,
   const char *varname 
);
errno_t _wgetenv_s( 
   size_t *pReturnValue,
   wchar_t *buffer,
   size_t numberOfElements,
   const wchar_t *varname 
);
template <size_t size>
errno_t getenv_s( 
   size_t *pReturnValue,
   char (&buffer)[size],
   const char *varname 
); // C++ only
template <size_t size>
errno_t _wgetenv_s( 
   size_t *pReturnValue,
   wchar_t (&buffer)[size],
   const wchar_t *varname 
); // C++ only

パラメータ

  • pReturnValue
    必要なバッファ サイズ。変数が見つからない場合は 0。

  • buffer
    変数とその値を格納するバッファ。

  • numberOfElements
    buffer のサイズ。

  • varname
    環境変数名。

戻り値

正常終了した場合は 0 を返します。失敗した場合はエラー コードを返します。

エラー条件

pReturnValue

buffer

numberOfElements

varname

戻り値

NULL

any

any

any

EINVAL

any

NULL

>0

any

EINVAL

any

any

any

NULL

EINVAL

上記のいずれかのエラー状況が発生すると、「パラメータの検証」に説明されているように、無効なパラメータ ハンドラが呼び出されます。実行の継続が許可された場合、この関数は errno を EINVAL に設定し、EINVAL を返します。

また、バッファが小さすぎる場合は、ERANGE が返されます。無効なパラメータ ハンドラは呼び出されません。関数は必要なバッファ サイズを pReturnValue に書き出し、より大きなバッファを使用してプログラムから再度この関数を呼び出すことができるようにします。

解説

getenv_s 関数は、環境変数のリストから varname を検索します。Windows オペレーティング システムでは、getenv_s の大文字と小文字が区別されません。getenv_s および _putenv_s は、_environ グローバル変数が指す環境のコピーを使用して環境にアクセスします。getenv_s は、ランタイム ライブラリからアクセスできるデータ構造体だけを対象とし、プロセスのためにオペレーティング システムが作成した環境 "セグメント" は対象としません。そのため、main または wmain の引数 envp を使用するプログラムは、無効な情報を取得する可能性があります。

buffer に返されたポインタを使用して環境変数の値を変更するのは安全とはいえません。環境変数の値を変更するには、_putenv_s 関数を使用します。環境テーブルで varname が見つからない場合は、buffer の値が空の文字列に設定されます。

ワイド文字を扱う場合は、getenv_s ではなく _wgetenv_s を使用します。_wgetenv_s の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。_wenviron グローバル変数は _environ と同じですが、ワイド文字を扱えるという点で異なっています。

SBCS ASCII プログラムなどの MBCS プログラムでは、環境がマルチバイト文字列で構成されているため、_wenviron の初期値は NULL です。その後、_wputenv を最初に呼び出すとき、または (MBCS) 環境が既に存在する場合に _wgetenv_s を最初に呼び出すとき、対応するワイド文字列環境が作成され、その後は作成されたワイド文字列環境が _wenviron によって参照されます。

同様に、Unicode (_wmain) プログラムでは、環境がワイド文字列で構成されているため、_environ の初期値は NULL です。その後、_putenv を最初に呼び出すとき、または (Unicode) 環境が既に存在する場合に getenv_s を最初に呼び出すときは、対応する MBCS 環境が作成され、その後は作成された MBCS 環境が _environ によって参照されます。

2 つの環境のコピー (MBCS および Unicode) がプログラムに同時に存在する場合、ランタイム システムは、両方のコピーを保持する必要があるため、実行時間が長くなります。たとえば、_putenv を呼び出す場合は、2 つの環境文字列が対応するように _wputenv も自動的に呼び出されます。

tb2sfw2z.alert_caution(ja-jp,VS.90).gif注意 :

まれに、ランタイム システムが Unicode 環境とマルチバイト環境の両方を保持している場合、これら 2 つの環境が正確に対応しないことがあります。これは、一意のマルチバイト文字列はすべて一意の Unicode 文字列に対応していますが、一意の Unicode 文字列は必ずしも一意のマルチバイト文字列に対応していないためです。詳細については、「_environ、_wenviron」を参照してください。

tb2sfw2z.alert_note(ja-jp,VS.90).gifメモ :

_putenv_s 系関数と _getenv_s 系関数はスレッド セーフではありません。_putenv_s が文字列を変更している間に _getenv_s が文字列ポインタを返すことがあり、これはランダム エラーの原因になります。これらの関数の呼び出しが同期されていることを確認する必要があります。

C++ では、これらの関数の使用はテンプレートのオーバーロードによって簡素化されます。オーバーロードでは、バッファ長を自動的に推論できるため、サイズの引数を指定する必要がなくなります。詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。

汎用テキスト ルーチンのマップ

TCHAR.H のルーチン

_UNICODE および _MBCS が未定義の場合

_MBCS が定義されている場合

_UNICODE が定義されている場合

_tgetenv_s

getenv_s

getenv_s

_wgetenv_s

TZ 環境変数の値を確認または変更するには、必要に応じて、getenv_s、_putenv、および _tzset を使用します。TZ の詳細については、「_tzset」および「_daylight、_timezone、および _tzname」を参照してください。

必要条件

ルーチン

必須ヘッダー

getenv_s

<stdlib.h>

_wgetenv_s

<stdlib.h> または <wchar.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

使用例

// crt_getenv_s.c
// This program uses getenv_s to retrieve
// the LIB environment variable and then uses
// _putenv to change it to a new value.
 
#include <stdlib.h>
#include <stdio.h>

int main( void )
{
   char* libvar;
   size_t requiredSize;

   getenv_s( &requiredSize, NULL, 0, "LIB");

   libvar = (char*) malloc(requiredSize * sizeof(char));
   if (!libvar)
   {
      printf("Failed to allocate memory!\n");
      exit(1);
   }

   // Get the value of the LIB environment variable.
   getenv_s( &requiredSize, libvar, requiredSize, "LIB" );

   if( libvar != NULL )
      printf( "Original LIB variable is: %s\n", libvar );

   // Attempt to change path. Note that this only affects
   // the environment variable of the current process. The command
   // processor's environment is not changed.
   _putenv_s( "LIB", "c:\\mylib;c:\\yourlib" );

   getenv_s( &requiredSize, NULL, 0, "LIB");

   libvar = (char*) malloc(requiredSize * sizeof(char));
   if (!libvar)
   {
      printf("Failed to allocate memory!\n");
      exit(1);
   }

   // Get the new value of the LIB environment variable. 
   getenv_s( &requiredSize, libvar, requiredSize, "LIB" );

   if( libvar != NULL )
      printf( "New LIB variable is: %s\n", libvar );
}

Original LIB variable is: c:\vctools\lib;c:\vctools\atlmfc\lib;c:\vctools\PlatformSDK\lib;c:\vctools\Visual Studio SDKs\DIA Sdk\lib;c:\vctools\Visual Studio SDKs\BSC Sdk\lib
New LIB variable is: c:\mylib;c:\yourlib

.NET Framework の相当するアイテム

System::Environment::GetEnvironmentVariable

参照

参照

プロセス制御と環境制御

環境定数

_putenv、_wputenv

_dupenv_s、_wdupenv_s