ページ 11

Debugビルド時、GetCurrentDirectory()の返り値がおかしい

Posted: 2014年9月15日(月) 02:21
by sp4nother
DebugビルドにおいてGetCurrentDirectory()で得られるファイルパスの大文字小文字が変わってしまいます。

コード:

// 環境:Windows 8 Pro 64bit / Visual Studio Express 2013
// カレントディレクトリは "\Users\username\Documents\Visual Studio 2013\Projects\" とする
const int MAX_LENGTH_PATH = 256;
char dir[MAX_LENGTH_PATH]; memset(dir, '\0', sizeof(dir));

GetCurrentDirectory(sizeof(dir), dir);
本来は、

C:\\Users\\username\\Documents\\Visual Studio 2013\\Projects\\~

でなければならないのに、

C:\\Users\\username\\documents\\visual studio 2013\\Projects\\~

という値が返ってきます。大文字小文字の変化に規則性があればまだ対処のしようがあるのですが、UsersやProjectが変化しておらずどうにもなりません。
Releaseビルドでは変化せず正しいパスが得られます...なぜこのようなことが起きるのでしょうか。
ご教授いただければ幸いです。

Re: Debugビルド時、GetCurrentDirectory()の返り値がおかしい

Posted: 2014年9月15日(月) 10:46
by Bull
こちらも質問者さんと同じような環境ですが、現象は再現しません。
現象を再現できる最小限のプログラムを提示することは可能ですか。


こちらで使用したプログラムは以下のようなものです。

コード:

#include <windows.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
	const int MAX_LENGTH_PATH = 256;
	char dir[MAX_LENGTH_PATH];
	memset(dir, '\0', sizeof(dir));
	GetCurrentDirectory(sizeof(dir), dir);

	printf("%s\n", dir);
}

GetCurrentDirectory() は API なので、Debug/Release には
関係ないように思います。どのように現象を確認しましたか?。

Re: Debugビルド時、GetCurrentDirectory()の返り値がおかしい

Posted: 2014年9月15日(月) 11:17
by へにっくす
sp4nother さんが書きました:本来は、

C:\\Users\\username\\Documents\\Visual Studio 2013\\Projects\\~

でなければならないのに、

C:\\Users\\username\\documents\\visual studio 2013\\Projects\\~

という値が返ってきます。
No.2のコードで私も現象を確認しました。
ただし、DOS窓で実行する分には、Release/Debugともにちゃんと出ましたよ。
デバッガで起動したときのみ、小文字で出力されました。
APIから返ってくる値なので、質問したいのならばMicrosoftにするしかないと思いますよ。

ただこういう大文字小文字の違いって、Unixとかなら、違うパス名になるが
Windowsの場合、大文字小文字を区別しないのでどちらも同じパスとして扱われます。
なのでそういうの前提で組み込んだ方がいいと思います。

Re: Debugビルド時、GetCurrentDirectory()の返り値がおかしい

Posted: 2014年9月15日(月) 12:17
by sp4nother
Bull さんが書きました:こちらも質問者さんと同じような環境ですが、現象は再現しません。
現象を再現できる最小限のプログラムを提示することは可能ですか。


こちらで使用したプログラムは以下のようなものです。

コード:

#include <windows.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
	const int MAX_LENGTH_PATH = 256;
	char dir[MAX_LENGTH_PATH];
	memset(dir, '\0', sizeof(dir));
	GetCurrentDirectory(sizeof(dir), dir);

	printf("%s\n", dir);
}

GetCurrentDirectory() は API なので、Debug/Release には
関係ないように思います。どのように現象を確認しましたか?。
以下の通りです。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE inst, HINSTANCE prevInst, LPSTR argv, int showCmd)
{

	const int MAX_LENGTH_PATH = 256;
	char dir[MAX_LENGTH_PATH];

	memset(dir, '\0', sizeof(dir));
	GetCurrentDirectory(sizeof(dir), dir);

	return 0; // この行でブレークポイントを設定し値を確認する

}
Releaseビルドで、というのはReleaseビルドで生成された実行ファイルを実行して、ということです。この場合、大文字小文字が変化しない正しいパスが得られるのですが...。

Re: Debugビルド時、GetCurrentDirectory()の返り値がおかしい

Posted: 2014年9月15日(月) 12:23
by sp4nother
へにっくす さんが書きました:ただこういう大文字小文字の違いって、Unixとかなら、違うパス名になるが
Windowsの場合、大文字小文字を区別しないのでどちらも同じパスとして扱われます。
なのでそういうの前提で組み込んだ方がいいと思います。
仰るとおり、返ってきた値をGetFileAttributes()で確かめると存在しているものと扱われているようです。
気にせずプログラムを組むのがいいのでしょうか?

Re: Debugビルド時、GetCurrentDirectory()の返り値がおかしい

Posted: 2014年9月15日(月) 14:08
by Bull
プロジェクトのプロパティでデバッグ/作業ディレクトリはどうなっていますか?
当方ではGetCurrentDirectory()で取得するディレクトリはそこで指定したものと
同じになるようです。デフォルトでは "$(ProjectDir)" ですが、直接指定することも
可能で、へにっくす さんがおっしゃるように Windows は大文字小文字を区別しま
せんので、存在するディレクトリならば、そのまま実行できます。
または、 "$(ProjectDir)" がどうなっているかですね。