本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。

[SDK16] DLL の中で getenv 関数を使うと NULL を返す

PWJ2624 - 95/07

この資料は以下の製品について記述したものです。

概要

この資料は DLL の中で getenv 関数を使って DOS の環境変数を取り出そうとしても、NULL が返される原因について説明したものです。

詳細

DLL の中からランタイムライブラリ関数 getenv は使用できません。

原因

DOS の環境変数は環境変数テーブルを探すことによって見つけることができますが、Windows の DLL からこの環境変数テーブルを参照することができません。そのため、ランタイムライブラリ関数 getenv を Windows の DLL から使うことができません。

対策

API の GetDOSEnvironment() 関数を使うことにより、getenv 関数の代用ができます。以下にサンプルプログラムを示します。

/**********************************************
 *  DLLGetEnv ( lpszVariableName )
 *
 *  引き数 lpszVariableName に環境変数名を渡すと、結果を戻り値として
 *  返します。もし存在しない環境変数名なら NULL を戻り値として返しま
 *  す。
 *
 **********************************************/
 
 LPSTR FAR PASCAL DLLGetEnv ( LPSTR lpszVariableName )
   {
   LPSTR lpEnvSearch;
   LPSTR lpszVarSearch;
 
   if ( !*lpszVariableName )  //  NULL ポインタの確認
     return NULL;
 
   //  DOS 環境変数ポインタの取得
   lpEnvSearch = GetDOSEnvironment ();
 
   // 文字列がある間繰り返す
   while ( *lpEnvSearch )
     {
     // 探す環境変数名を保存
     lpszVarSearch = lpszVariableName;
 
     // 環境変数の検索
     while ( *lpEnvSearch && * lpszVarSearch &&
             *lpEnvSearch == *lpszVarSearch )
       {
       lpEnvSearch++;
       lpszVarSearch++;
       }
 
      // もし名前が一致したなら、lpEnvSearch は "=" を指し、
      // lpszVarSearch が NULL の界線を指す。そして
      // lpszEnvSearch が環境変数の中身を示している。
      // もし名前が一致しなければ、lpEnvSearch が次の環境変数を
      // 指している。
     if ( *lpEnvSearch == '=' && *lpszVarSearch == '\0' )
       return ( lpEnvSearch + 1 );
     else
       while ( *lpEnvSearch )
         lpEnvSearch++;
 
     // ここに到達した時点で、一つの環境変数の確認が終了した。
     // もし、次の文字が NULL なら検索に失敗した。
     lpEnvSearch++;
     }
 
   return NULL;
   } 

その他

(C)1995 Microsoft Corporation. All rights reserved.

マイクロソフト株式会社 テクニカル サポート


UP
UP
Home
HOMEPAGE
inserted by FC2 system