• ベストアンサー

C言語を用いた環境変数の作成/削除方法

C言語でプログラムを組んで、 以下の2点を実施したいと考えています。 ・任意の名前の環境変数を作成したい。 ・既存の環境変数(自分が任意に名前をつけて作成した環境変数)を  削除したい。 実現するにはどうしたらよいでしょうか? (作成はputenvでよいでしょうか? 削除については調べたのですが分かりませんでした。) お手数ですがご回答いただけると幸いです。

  • xf710
  • お礼率67% (21/31)

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.7

★追記アドバイス ・レジストリを操作すると出来そうですよ。 ・ただし、設定を反映するには再ログイン、再起動が必要のようです。 ・レジストリの操作はここで説明するのはとても大変です。 ・やはり、自分でシステム全体の環境変数を操作するライブラリ関数を  作った方が良いでしょう。→大変ですが……。 ・最後に、下の『参考URL』をどうぞ。→『環境変数をシステムに通知する方法 』

参考URL:
http://support.microsoft.com/kb/104011/ja
xf710
質問者

お礼

追記アドバイスありがとうございます。 ライブラリ関数作成等、 実施したい内容を具現化するのはなかなか難しそうですね。 質問するにしても知識不足な為、自己調査を行った後、 実施内容を具体的に明示できるようにしたいと考えます。 レジストリ操作は難しそうですね…学習したいと思います。 また新たに質問を投稿するかと思いますが、 その際はまたご回答頂けると幸いです。 Oh-Orangeさんをはじめご回答頂いた皆様ありがとうございました。

その他の回答 (6)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★回答者 No.3 です。 ・やはり、システム全体の環境変数を操作したいのですね。 ・『getenv』、『putenv』関数はシステムの環境変数のコピーを操作します。 ・『環境変数のエントリー・ポインタ』とはコピーした領域のことです。 ・『MS-DOS』時代からシステムの環境変数を操作するのは結構面倒でした。 ・『MS-DOS』時代では、システム全体の環境変数のアドレスを取得してから  環境変数の文字列を独自に操作する関数ライブラリで設定&削除していました。 ・『Windows』時代では、アドレスを取得しても変更禁止でエラーになると思います。 ・よって、システム全体の環境変数を操作するにはそれ専用の関数があれば  出来ますが……。今のところ私は知りません。→検索してもすぐには見つかり  ませんでした。 ・回答ではありませんが、とにかく『getenv』、『putenv』関数ではシステムの  環境変数を操作できませんよ。分かりましたか? ・これ以上アドバイスできません。申し訳ありませんです……。

xf710
質問者

お礼

質問の内容が不足しており伝わりづらかったようで 申し訳ありません。 自分で調べていてご明示頂いた関数では難しそうだと 思っていたのですがハッキリとシステム環境変数・ユーザ環境変数 が操作できないと分かり収穫となりました。 ありがとうございます。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★回答者 No.3 です。回答者 No.2 さんの指摘ありがとう。 ●修正した正しい指摘です。 ・間違い  memset( env_name_make, '\0', sizeof(STR_MAX+1) );  memset( env_name_del, '\0', sizeof(STR_MAX+1) );  memset( path, '\0', sizeof(PATH_MAX+1) ); ・正しい(タイプ1)  memset( env_name_make, '\0', sizeof(env_name_make) );  memset( env_name_del, '\0', sizeof(env_name_del) );  memset( path, '\0', sizeof(path) ); ・正しい(タイプ2)  memset( env_name_make, '\0', STR_MAX );  memset( env_name_del, '\0', STR_MAX );  memset( path, '\0', PATH_MAX ); ・正しい(タイプ3)  char env_name_make[ STR_MAX + 1 ] = { 0 };  char env_name_del[ STR_MAX + 1 ] = { 0 };  char path[ PATH_MAX + 1 ] = { 0 };  と宣言すると『memset』関数を使わなくても初期化します。→回答者 No.2 さんと同じ。 ※正しく動作させるには、上記のタイプ1~タイプ3のどれかを記述します。  また、『sizeof』演算子はバッファなどのサイズを求めるため『定数』を指定すると  整数のバイト数になります。→int型が16ビット環境なら 2バイト、32ビット環境なら 4  バイトが返されます。よって、sizeof(STR_MAX+1) ではなく sizeof(env_name_make) です。 ●追記アドバイス ・『strcat』より、『strcpy』関数を使うと初期化する必要はありませんよ。

xf710
質問者

お礼

ご指摘頂いた内容に対しての補足ありがとうございます。 どのようにすれば良いかを具体的に明示頂けると 単純に実施方法が分かったり、自分の実施方法と比較ができる等 非常に参考になります。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

あのー > 間違い:sizeof(STR_MAX+1) ではなく、 > 正しい:sizeof(STR_MAX) で良い。 整定数の sizeof とってどうしようと? sizeof env_name_make とするか memsetの引数に STR_MAXそのまま与えるか じゃないんでしょうか? そもそも、 char env_name_make[STR_MAX] = ""; とか char env_name_make[STR_MAX] = {0}; でいいような気がしますが。

xf710
質問者

お礼

ご指摘ありがとうございます。 質問の趣旨とは外れましたが、 こういうご指摘を頂けるのは非常にありがたいです。 正しいコーディングを心掛けて実施したいと思います。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★指摘! ・上から11行目でエラーを発見!→『/*』が『*』になっています。 ・『memset』の部分が危険ですよ。  間違い:sizeof(STR_MAX+1) ではなく、  正しい:sizeof(STR_MAX) で良い。    または、  char env_name_make[STR_MAX + 1];  char env_name_del[STR_MAX + 1];  char path[PATH_MAX + 1];  と宣言します。 ・戻り値の『ret』を『unsetenv』で上書きしていますが、良いの? ★原因 ・私も、OS は WindowsXP、開発環境は Visual Stadio .NET 2003 を使っています。 ・『setenv』、『unsetenv』、『putname』の3つの関数は元々ありませんよ。 ・よって、『識別子は、引数依存の照合を使用しても見つかりません。』とエラーとなります。 ・つまり、『getenv』、『putenv』の2つしか関数が最初からないってことだ。 ・『getenv』は環境変数のエントリー・ポインタを取得します。 ・『putenv』は環境変数のエントリー・ポインタに文字列を設定(削除)します。 ★回答 ・『putname』ではなく『putenv』でしょう。  putenv( "ENVNAME=string" ); ←環境変数『ENVNAME』に、『string』という値を設定  putenv( "ENVNAME=" ); ←環境変数『ENVNAME』を削除  getenv( "ENVNAME" ); ←環境変数『ENVNAME』を取得(ポインタで) ・以上。おわり。分かりましたか?

参考URL:
http://www9.plala.or.jp/sgwr-t/index.html
xf710
質問者

補足

ご丁寧にご回答頂きありがとうございます。 ご指摘頂いた内容については以下の通りです。 >・上から11行目でエラーを発見 >・戻り値の『ret』を『unsetenv』で上書きしていますが、良いの?  質問するにあたり余計なコーディングを削除した際の影響です。  申し訳ありません。戻り値上書きも特に問題ありません。 >・『memset』の部分が危険ですよ。  ご指摘ありがとうございます。  見直してみて危険な事をやってることに気付きました。 教えていただいたputenv、getenvを用いて、 環境変数を取得/変更/削除することができました。 但し一点問題がありまして、 「システムのプロパティ」画面の「詳細設定」タグの「環境変数」ボタンを 押下し、環境変数を確認したところユーザ環境変数、システム環境変数 共にプログラムの内容が反映されませんでした。 上記関数を用いてプログラムにて関数を変更しても、 Windows側(上記画面)には反映されないのでしょうか? (反映されたとしてもプログラム実行中の一時的なものなのでしょうか?) 最終的に実施したい内容として、 上記画面のユーザ環境変数、システム環境変数をプログラムで操作し その結果を上記画面に反映させたいと考えています。 言葉足らずで申し訳ありません。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

Visual C++ 6 では作成も変更も削除も _putenv( const char *envstring );で出来ます。 削除の場合は*envstringにvarname=とします。 .NETでも同じではないでしょうか

xf710
質問者

お礼

ご回答ありがとうございました。 環境変数を一時的に操作する方法が分かりためになりました。

xf710
質問者

補足

※回答1の追加質問も合わせて載せてしまいすいません。 以下のようにプログラムを組んだところ、 エラーメッセージが出ました。 ・e:\program_test\testprg_c\env_var.cpp(58): error C3861: 'setenv': 識別子は、引数依存の照合を使用しても見つかりません。 ・e:\program_test\testprg_c\env_var.cpp(62): error C3861: 'unsetenv': 識別子は、引数依存の照合を使用しても見つかりません。 ・e:\program_test\testprg_c\env_var.cpp(65): error C3861: 'putname': 識別子は、引数依存の照合を使用しても見つかりません。 #defineで正しく宣言されていると思うのですが、 解決策が分かりません。 解決策を教えていただけると幸いです。 /*++++++++++++++++++++++++++++++++++++++++++++++++++++ // インクルード ++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include<stdio.h> #include<stdlib.h> #include<iostream> /*++++++++++++++++++++++++++++++++++++++++++++++++++++ // 関数のプロトタイプ ++++++++++++++++++++++++++++++++++++++++++++++++++++*/ extern int env_var(); *++++++++++++++++++++++++++++++++++++++++++++++++++++ // define ++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #define STR_MAX 256 #define PATH_MAX 512 /*++++++++++++++++++++++++++++++++++++++++++++++++++++ // メイン文 ++++++++++++++++++++++++++++++++++++++++++++++++++++*/ extern int env_var() { // 変数宣言 int ret; // 戻り値(0:正常、-1:異常) char env_name_make[STR_MAX]; // 作成する環境変数名 char env_name_del[STR_MAX]; // 削除する環境変数名 char path[PATH_MAX]; // ファイルパス char *varname; // putname使用変数 // 変数初期化 ret = 0; memset(env_name_make, '\0', sizeof(STR_MAX+1)); memset(env_name_del, '\0', sizeof(STR_MAX+1)); memset(path, '\0', sizeof(PATH_MAX+1)); // 環境変数名、パス設定 strcat(env_name_make, "BBB"); strcat(env_name_del, "AAA"); strcat(path, "C:\\Program Files\\"); // setenv関数(環境変数を作成) // setenv(const char *name, const char *value, int overwrite); ret = setenv(env_name_make, path, 0); // unsetenv関数(環境変数を削除) // int unsetenv(const char *name); ret = unsetenv(env_name_del); // putname関数(環境変数の作成/変更/削除) putname(varname = env_name_del); return ret; }

noname#39970
noname#39970
回答No.1

実行環境は? とりあえず unsetenv http://www.linux.or.jp/JM/html/LDP_man-pages/man3/unsetenv.3.html

xf710
質問者

お礼

ご回答ありがとうございました。 以後、質問をより具体的に明示するよう気をつけたいと思います。

xf710
質問者

補足

早急なご回答ありがとうございます。 実行環境の記述を忘れていて申し訳ありません。 OSはWindowsXP、開発環境はVisual Stadio .NET 2003を用いています。 教わった関数を試してみます。

関連するQ&A

  • BorlandC++5.5言語の環境変数変数の設定方法を教えて下さい。

    環境変数で質問があります。Bortland5.5の環境変数の設定方法を教えて下さい。 今までJavaとtomcatをDLしました。これらPathという名前で設定してきました。 Bortland5.5もPathで設定すればいいようですがどう設定していいのかよくわかりません。 私は「BCC」という名前で設定してみました。 是非に環境変数の設定方法を教えて下さい。 今回C++言語であるBortlandをDLしました。 ダウンロード先はprogram files です。先ほど見たところBinというファイルが DLされてました。環境変数の設定で BCC55をDLしたので「システム環境変数をBCC=C:\Program Files\Bin」 としてユーザー環境変数を「C:\Program Files\Java\jdk1.5.0_05\bin;%CATALINA_HOME%;\bin;%BCC%」 と入力したところエラーが表示されます。 「Hello.c」というファイルを作成しコンパイルすると以下のエラーが出ます。 ーーーーーーーーーーーーーーーーーーーーーーーー c:\october>bcc32 Hello.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland hello.c: エラー E2209 hello.c 1: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 hello.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) 警告 W8070 hello.c 6: 関数は値を返すべき(関数 main ) *** 1 errors in Compile *** 実行するとエラーがでます。 c:\october>Hello 'Hello' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と表示されます。 なお作成したファイルは以下のC言語です。ファイル名「Hello.c」 #include <stdio.h> main() { printf("Hello, C Program!\n"); }

  • システム環境変数の削除の自動化(バッチ化)

    ●質問内容 システム環境変数を変更する場合(WindowsXP時)、 「スタート」⇒「設定」⇒「コントロールパネル」⇒「システム」の 「システムのプロパティ」画面の「詳細設定」タグ内の「環境変数」ボタンを 押下して「環境変数」画面にて新規/編集/削除を実施すると思います。 システム環境変数の削除を行うにあたり上記一連操作をバッチファイル 等の単純操作にて実施したいと考えているのですがどのようにすれば実現できるでしょうか? 条件は以下の通りです。 ・OSはWindowsXPもしくはWindows2000。 ・削除するシステム環境変数名は決まっている。 ・ログオン/ログインや再起動は行わずに削除情報を反映させたい。 ●質問内容補足 自分で調べた範囲ではシステム環境変数の新規/編集であれば Windows2000のリソースキット中のsetx.exeというプログラムを 利用すれば可能だということが分かりました。 このHPで言っているように削除もバッチ処理で行いたいのです。 参考HP<<http://chinpindo.blog11.fc2.com/blog-entry-61.html#more>> お手数ですがご回答頂けると幸いです。 よろしくお願いいたします。

  • Linux環境変数設定(putenv?setenv?)

    RedHatLinux7.3(2.96-110)、gcc(2.96 20000731)です。 C言語でプログラミングしていますが、環境変数設定がうまくいかず困っています。 下記の2つで試しましたが、どちらも戻り値は正常(0)なのに環境変数には設定されないのです。 その1: nRet = putenv( "HOGE_HOGE_VER=1.0.0" ); その2: nRet = setenv( "HOGE_HOGE_VER", "1.0.0", 1 ); この使い方は間違っているのでしょうか?それと、putenv、setenvの違いはなんなのでしょうか? ちなみに、既に設定されている環境変数をgetenvすることは、ちゃんとできるのですが。 よろしくお願いします。

  • ライブラリ作成時のグローバル変数の対応(C言語)

    C言語を用いてライブラリを作成しています。 ライブラリは機能ごとにファイルを分けています。 今、ライブラリの中でのみ使用するグローバル変数やグローバル関数が必要になりました。 このグローバル変数や関数は複数ファイルで参照するため、static宣言はできません。 しかし、このグローバル変数や関数は公開する必要はありません(ライブラリの中でのみ使用します)。 このようなことをC言語で実現するためにはどうしたらよいのでしょうか? 開発環境は Windows7 VisualC++2010 です。 VisualC++2010を使うなら C++で書けばいいのではないかといわれそうですが、 C言語でプログラミングしたいのです。 以下のようなサイトがあったのですが、これを使うしかないでしょうか? http://0xcc.net/blog/archives/000108.html

  • ユーザー環境変数の一覧

    システム環境変数とログインしている環境変数それと、 存在する全てのユーザーに対する環境変数を取得するプログラムをC言語作成したいのですが、どうすればよいのでしょうか? OSはWindows2000です。 言語は問いません、VC++2005かC#かVB.NETのどれでも構いません。

  • Accessで作ったアプリをC言語でつくり直し?

    現状、Access2003で業務用のアプリケーションを 作成しています。 しかし、上司から、C言語で作りかえるよう指示が ありました。 理由は、パソコン環境に依存しないから で、私もそれほどC言語に詳しくのないので 調べて見ましたが、 テキストベースのプログラムの書き方や変数の宣言 などの情報はあるのですが、 じゃあ、Accessで作った入力用のフォームとか 入力した内容を印刷するための帳票(レポート)などは どのようにしてC言語で実現するのかが、わかりません。 C言語でGUI環境を作り出し、なおかつデータベース機能を 持たせることはできるのでしょうか

  • 「環境変数を作成する方法」がどうしても分かりません。教えてください

    お世話になっております。 以前から環境変数について勉強しているのですが、文字で理解はできても実感がわきません。 もっと言えば、「分かりやすい言葉で噛み砕けていません」そして「何をすれば設定を変えられるのか?という「実感レベル」に落とし込めていません」。 ちゃんと理解できていないので、的を射ていない質問かもしれませんが、教えていただけないでしょうか? (私の環境変数に対する認識は→「プログラムを動作させるためのプロセスを定義するための仕組み」と理解しておりますが、間違っていたら申し訳ございませんがご指摘ください) 前は、ログオンした時間がわかるバッチファイルを作ったのですが、それ以上の情報を引き出すには環境変数をいじらなければならないようです。 今回で言えば、ログオンした時にユーザ名も取得できる方法を知りたいと思っております。 ヒントをいただければ幸いです。 ※「~を使う」だけではなく、既存の環境変数など例に用いて仕組み(メカニズム)も解説いただけるとわがままではありますが、非常に嬉しいです。 贅沢申して恐れ入りますが、宜しくお願い致します。

  • C言語を用いたファイルの一括削除について

    C言語を用いたファイルの一括削除について 自分は、C言語でファイルの操作するプログラムを作成しているのですが、 たとえば、 out/temp1.jpg out/temp2.jpg out/temp3.jpg ここで、"out/temp"という文字列が一致するファイルを一括で削除したいのですが、 これはどういった関数を用いれば実現できるでしょうか? どうかよろしくお願いします。

  • c言語で作成したデータをwindowsのアプリ(VB6で作成)で読み取りたいのですが

    VBで作成したアプリの中の変数の値をC言語で作成したプログラムで参照したり、C言語の変数(メモリの値)をVBのアプリで参照したいのですが、どのようにすればいいのでしょうか。 よろしくお願いします。

  • 同時に環境変数を変えることはできるのでしょうか・

    javaのプログラミングの勉強をしていて、ついでにC言語の勉強をはじめようと思ったのですが、環境変数のところでいきなりつまずいています。 javaの環境変数はきちんと設定されているのですが 新しくC言語の環境変数を通すと、以前のjavaで設定 した環境変数を消すことになってしまいます。 javaとc言語のpathの環境変数を同時に設定したまま 残すことはできないのでしょうか? どなたかお願いします!!

専門家に質問してみよう