CreateProcessの引数の新しい環境ブロックには?

[戻る]
山本 2002/01/17(木) 14:33:11
はじめまして、山本と申します!
こんなすばらしい掲示板を見つけてうきうきしています。

早速ですが、質問させていただきます。

CreateProcessの引数の環境ブロックについてなんですが、
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_createprocess.htm
で説明を見てもよく理解できません。

-----説明一部引用-------------------------------------------
新しいプロセスの環境ブロックへのポインタを指定します。このパラメータで NULL を指定した場合、新しいプロセスは呼び出し側プロセスと同じ環境を使います。 
NULL で終わる文字列を複数組み合わせたものを 1 つのブロックとし、そのブロックを NULL で終わらせると、1 つの環境ブロックが形成されます。各文字列の形式は次のとおりです。 

name=value 
--------------------------------------------------------

もし、
name=TAKESHI
address=TOKYO
っていうのを渡したければ、
char *env[3] = {"name=TAKESHI","address=TOKYO",0};
とするっていう意味なんでしょうか?
それとも
char *env = "name=TAKESHI\0address=TOKYO\0\0";
                         ^^             ^^^^
にするのでしょうか?

よろしくお願い致します。

クラフトマン 2002/01/18(金) 12:10:56
形式としては、"name=TAKESHI\0address=TOKYO\0" でしょうね。
                                         ↑ここは1つ(文字列終端の\0が付くので計2つになる)

ただし、環境ブロックには、いろいろルールがあるので、これをそのまま環境ブロックとして
渡していいとは思えません。
私だったら、自分の環境に渡したいものを設定してから、それを子プロセスに渡します。

    '子プロセス用の環境変数設定
    SetEnvironmentVariable("name", "TAKESHI");
    SetEnvironmentVariable("address", "TOKYO");

    CreateProcess(pEnvironmentはNULL);

    '子プロセス用の環境変数削除
    SetEnvironmentVariable("name", NULL);
    SetEnvironmentVariable("address", NULL);

山本 2002/01/20(日) 23:02:33
アドバイスありがとうございます。

当方のプログラムでは、
_beginthread(...)でスレッドを作成して、それぞれのスレッドでCreateProcess(...)を使っているのですが、
CreateProcess(...)の前にSetEnvironmentVariable(...)関数を使うと、他のスレッドにも影響があると思う
のですが、どうでしょうか?

影響がなければ完璧なのですが。

よろしくお願い致します。

クラフトマン 2002/01/23(水) 11:39:16
残念ながら、環境ブロックのマルチスレッドでの挙動に関しては、よく知りません。
環境ブロックがプロセス単位でしか用意されないのであれば、影響あるでしょうね。
その場合は、
  ・SetEnvironmentVariable()で、プロセスの環境ブロックに、環境変数を設定
  ・GetEnvironmentStrings()で、環境ブロックのコピーを取得
  ・SetEnvironmentVariable()で、プロセスの環境ブロックを元に戻す
という一連の処理をクリティカルセクションなどで同期を取って実行し、スレッド
固有の環境ブロックを作成し、それを子プロセスに渡せばよさそうです。
子プロセス呼出し後は、FreeEnvironmentStrings()をお忘れなく。

古いスレッドには追加発言できません。