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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
sp4nother
記事: 3
登録日時: 5年前
住所: 関東地方
連絡を取る:

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

#1

投稿記事 by sp4nother » 5年前

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ビルドでは変化せず正しいパスが得られます...なぜこのようなことが起きるのでしょうか。
ご教授いただければ幸いです。

Bull
記事: 138
登録日時: 5年前

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

#2

投稿記事 by Bull » 5年前

こちらも質問者さんと同じような環境ですが、現象は再現しません。
現象を再現できる最小限のプログラムを提示することは可能ですか。


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

コード:

#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 には
関係ないように思います。どのように現象を確認しましたか?。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

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

#3

投稿記事 by へにっくす » 5年前

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の場合、大文字小文字を区別しないのでどちらも同じパスとして扱われます。
なのでそういうの前提で組み込んだ方がいいと思います。
written by へにっくす

アバター
sp4nother
記事: 3
登録日時: 5年前
住所: 関東地方
連絡を取る:

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

#4

投稿記事 by sp4nother » 5年前

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ビルドで生成された実行ファイルを実行して、ということです。この場合、大文字小文字が変化しない正しいパスが得られるのですが...。

アバター
sp4nother
記事: 3
登録日時: 5年前
住所: 関東地方
連絡を取る:

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

#5

投稿記事 by sp4nother » 5年前

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

Bull
記事: 138
登録日時: 5年前

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

#6

投稿記事 by Bull » 5年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る