CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

VC2017でWindowsの環境変数を取得する方法

投稿日:2019年1月14日 更新日:

C++のUnicodeプロジェクトにおいて、_wgetenvでWindowsの環境変数が取得できるのはわかる。

こんなソースがあって、ビルドしたらエラーになった。

void CMFCApplication1Dlg::OnBnClickedButton2()
{
	TCHAR* buffer;
	buffer = _wgetenv(_T("PATH"));
	AfxMessageBox(buffer);
}

error C4996: ‘_wgetenv’: This function or variable may be unsafe. Consider using _wdupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
ようするに、セキュリティ付きの関数である_wdupenv_sを使わないとダメだよということ。

プロジェクトのプロパティ⇒C/C++⇒全般⇒SDLチェックを「いいえ」にすればワーニングで済む。
さらにはワーニングの4996を無視してしまえば、ワーニングすら出ないようにすることはできる。
それも気持ち悪いので、セキュリティ対応した_wdupenv_sの使い方を記録しておく。

void CMFCApplication1Dlg::OnBnClickedButton1()
{
	TCHAR* buffer = NULL;
	size_t requiredSize = 0;
	_wgetenv_s(&requiredSize, NULL, 0, _T("PATH"));
	if (requiredSize == 0)
	{
		AfxMessageBox(_T("error"));
		return;
	}
	buffer = new TCHAR[requiredSize];
	_wgetenv_s(&requiredSize, buffer, requiredSize, _T("PATH"));
	AfxMessageBox(buffer);
	delete buffer;
}

-ソフト開発

執筆者:


  1. コーイチ より:

    久しぶりにコメントします。
    https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/dupenv-s-wdupenv-s?view=vs-2017

    Notes
    It is the calling program’s responsibility to free the memory by calling free.

    と書いてあるので、_wdupenv_s()自体が、戻り値をコピーするバッファの割り当てを行うみたいなので、自前でnew しないで、メモリを解放すれば良いみたいですね。

  2. com より:

    _wdupenv_sじゃなくて、_wgetenv_sなのでちょっと違う感じですね。わざわざメモリーサイズ取得して、メモリー取得して、さらにメモリー破棄しないといけないわけで、チョーメンドウですよ。セキュリティ対策前の_wgetenvは何もしなくてよかったんですけどね。
    https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/getenv-s-wgetenv-s?view=vs-2017

コーイチ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

PDFアレコレをコマンドラインから実行できるようにするための設計

PDFアレコレ起動時のパラメータを受け取って、アレコレの操作をコマンドラインから実行できるようにするプランを考えた。 これによって、UI操作なしで大量のPDFファイルに対して一括でアレコレの操作が可能 …

WinMergeで複数拡張子を対象とするファイルフィルタと簡単な行フィルタ指定をやってみた

WinMergeでファイル比較することは、SEだったらみんなやっていることと思う。でもファイルフィルタと行フィルタは使ったことがないと思う。おいらだって、何年もWinMergeを使ってきたけど、正規表 …

no image

CEditでドラッグ&ドロップ

プログラミングから離れてしばらく経ってしまった。 プロジェクト管理をやっていると、プログラミングをやることができなくなる。 対人間の仕事の合間にプログラムをやることは、おいらには無理だった。 プログラ …

コピー元でzip圧縮後にネットワーク越しにファイルコピーしてコピー先で解凍するのを自動化できないか

コピー元でzip圧縮後にネットワーク越しにファイルコピーしてコピー先で解凍するのを自動化できないか。。とここ数日考えていた。そんなことをしたい理由と要件をはっきりさせておく。 対象のファイルやフォルダ …

no image

C++

プログラム言語で唯一まともに使えるのがC++だったりするおいらなわけだが、 C++のことをずいぶん知っているかというとそうでもなかったりする。 absという関数があって、絶対値を求めるものだっていうの …