2011-07-05 21 views
0

だから私は、次のコードを試してみてください。なぜ理論的にクロスプラットフォームのコードはWindows環境変数を変更しないのですか?

#include <iostream> 
#include <cstring> 
#include <cstdlib> 
#include <sstream> 
#include <boost/filesystem/v3/path.hpp> 
#include <boost/filesystem/v3/operations.hpp> 
#ifdef WIN 
#include <Windows.h> 
#endif 

void setEnviromentVariable(std::string name, boost::filesystem::path value) 
{ 
    if (getenv (name.c_str())==NULL) 
    { 
     std::cout << "Hit ENTER to restart application in order to agree with the next terms of use: do not eat my bytes!)" << std::endl; 
     std::stringstream VAR; 
     VAR << name<< "=" << value.native().c_str(); 
      #ifdef WIN 
     std::stringstream VAL; 
     VAL << value.native().c_str(); 
     if(!SetEnvironmentVariable(TEXT(name.c_str()), TEXT(VAL.str().c_str()))) 
     { 
      printf("SetEnvironmentVariable failed (%d)\n", GetLastError()); 
     } 
      #else 
     setenv(VAR.str().c_str()); 
      #endif 
     std::cin.get(); 

    } 

} 
int main(int argc, char *argv[]) 
{ 
     boost::filesystem::path full_path(boost::filesystem::current_path()/"assets/"); 
     setEnviromentVariable("TCL_LIBRARY", full_path); 
} 

私のコードが間違っていますか?なぜそれは環境変数を設定しないのですか、なぜ私にエラーを表示しないのですか? (WIN code is based on this.

答えて

2

putenv()環境ベクトルに指定された文字列ポインタを置きます。文字列の値はコピーされません。

文字列は、string becomesの環境の一部です。 プログラムは文字列を変更または解放してはならず、putenv()の引数としてスタックまたは その他の一時的な文字列変数を使用しないでください。

したがって、VARが範囲外になると、環境にはガベージポインタが含まれており、アクセスしようとするとゴミがセーブされるか、またはゴミが返されます。

+0

+1これを解決するには? – Rella

+0

より柔軟で引数をコピーする 'setenv()'関数がしばしばあります。しかし、Windows上でどのような機能が利用できるのかはわかりません。なぜなら、私が通常行っているような提案は何も含まれていなかったからです。 – geekosaur

+0

でも、googleもvsも見つけることはできません=( – Rella

1

geekosaurの回答に加えて。シェルからプログラムを実行する場合、たとえば、C++プログラムから "export TCL_LIBRARY = calculated_value"(どのシェルを使用するかによって異なります)などの文字列をいくつかのファイルに書き込んでからこのファイルを実行できます。

#!/bin/bash 
your_program.exe 
source generated_file_with_variable 
next_program.exe 
+0

申し訳ありません - 私のC++コードの一部である必要があります... – Rella

0

プロセスには独自の環境コピーがあり、すべての変更がそのコピーに影響します。あなたの修正を見る他の唯一のプログラムはあなたが起動する子プロセスであり、あなたは子プロセスを生成する時にあなたの環境が凍結しているのを見るでしょう。あなたを始めたプログラムはまったく影響を受けません。

このため、アプリケーションの再起動についてのあなたのコメントは意味がありません。新しいインスタンスは、親プロセスの環境のコピーを取得します。あなたが変更を加えたものではありません。 (OTOH、あなたのプログラムが新しいコピーを開始した場合、それはあなたの変更された環境ブロックを継承するでしょう)。

関連する問題