CreateProcessの引数の新しい環境ブロックには? – プログラミング – Home

CreateProcessの引数の新し...
 
通知
すべてクリア

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


山本
 山本
(@山本)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

はじめまして、山本と申します!
こんなすばらしい掲示板を見つけてうきうきしています。

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

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;
^^ ^^^^
にするのでしょうか?

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


引用解決済
トピックタグ
クラフトマン
 クラフトマン
(@クラフトマン)
ゲスト
結合: 24年前
投稿: 72
 

形式としては、name=TAKESHI\0address=TOKYO\0 でしょうね。
↑ここは1つ(文字列終端の\0が付くので計2つになる)

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

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

CreateProcess(pEnvironmentはNULL);

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


返信引用
山本
 山本
(@山本)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

アドバイスありがとうございます。

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

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

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


返信引用
クラフトマン
 クラフトマン
(@クラフトマン)
ゲスト
結合: 24年前
投稿: 72
 

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました