たびたびこの掲示板を利用させていただいています。
早速質問のですが、環境変数の取得で困っています。
【現象】
BOOL GetCreateTempDir( CHAR* pTemp )
{
DWORD sts;
sts = ExpandEnvironmentStrings( %TEMP% , pTemp , MAX_PATH_SIZE ) ;
if ( 0 == sts )
{
return FALSE;
}
return TRUE;
}
という関数を作成して、環境変数%TEMP%を表す文字列を取得しようとしています。
この関数はDLLになっております。
ところが、あるプロセスでは正しく文字列(今回の場合、C:\Temp)がかえってきます
が、
別のプロセスでは%TEMP%のままかえってきてしまいます。
どちらのプロセスもこのDLLの呼び出し方は同じなのですが、
何故異なってしまうのか、いろいろと検討したのですが、わかりません。
どうぞ、よろしくお願いいたします。
【開発環境】
VC++6.0
WinXP
【テスト環境】
WinNT
ヘルプにはエラーだと復帰値が0
バッファサイズが小さいと必要なバッファサイズが復帰値として返ってくる
環境変数名が見つからないと%~%の部分はそのままで残される
と書かれていますよ
実行しているユーザは同じですか?
ダメなプロセスは
CreateProcess 関数の
LPVOID lpEnvironment に別の環境ブロックを割り当てたというようなことではないのでしょ
うか?
回答ありがとうございます。
実行しているユーザーは同じです。
あれから少し調べたところ以下の点がわかりました。
Test.exeというプロセスを作成しました。(試すためのプロセスです。)
これは実行すると環境変数(%TEMP%)から文字列を取得するようにしました。
1.このプロセスを実行すると環境変数は取得できます。
2.サービスとして登録して実行すると(%TEMP%)のままかえってきてしまいます。
ExpandEnvironmentStrings関数は名前がみつからないとそのまま返すようですが、
なぜサービスとして登録し実行した場合は名前が見つからないのでしょうか。
サービスはログオンしなくても実行されるからではないでしょうか
そうですか。
ちなみにWindows2000ではサービスとして起動しても、
取得できました。
WindowsNTだけダメなんです。
Windows NTでは,TEMP/TMPはユーザー環境変数として設定されています。
なのでSYSTEMアカウントでは使えないのでしょう。
TEMPをシステム環境変数で登録するか,
サービスをTEMPが使えるユーザーで動かすとよいでしょう。
解決しました。回答していただいた方々、ありがとうございました。
WindowsNTについて知識不足なところがあり、
ご迷惑をお掛けしました。